Expose the fact dx and du are linear

This commit is contained in:
numzero 2024-06-11 00:02:09 +03:00
parent fdc4e22da0
commit 17ed87035a

View File

@ -243,7 +243,7 @@ impl Space {
Inner => { Inner => {
let Vec2 { x, y } = obj.loc.pos; // в основной СК let Vec2 { x, y } = obj.loc.pos; // в основной СК
let y = self.rect.u(y) + y.signum() * (self.rect.external_halflength - self.rect.internal_halflength); let y = self.rect.u(y) + y.signum() * (self.rect.external_halflength - self.rect.internal_halflength);
let dy = self.rect.du(y, 1.0); let dy = self.rect.du(y);
let m = Mat2::from_cols_array(&[1.0, 0.0, 0.0, dy]); let m = Mat2::from_cols_array(&[1.0, 0.0, 0.0, dy]);
Object { Object {
id: obj.id, id: obj.id,
@ -611,14 +611,14 @@ impl FlatCell for RectInside {
fn ray_to_global(&self, ray: Ray) -> Ray { fn ray_to_global(&self, ray: Ray) -> Ray {
Ray { Ray {
pos: self.pos_to_global(ray.pos), pos: self.pos_to_global(ray.pos),
dir: vec2(ray.dir.x, self.rect.dx(ray.pos.y, ray.dir.y)), dir: vec2(ray.dir.x, self.rect.dx(ray.pos.y) * ray.dir.y),
} }
} }
fn ray_to_local(&self, ray: Ray) -> Ray { fn ray_to_local(&self, ray: Ray) -> Ray {
Ray { Ray {
pos: self.pos_to_local(ray.pos), pos: self.pos_to_local(ray.pos),
dir: vec2(ray.dir.x, self.rect.du(ray.pos.y, ray.dir.y)), dir: vec2(ray.dir.x, self.rect.du(ray.pos.y) * ray.dir.y),
} }
} }
@ -641,8 +641,8 @@ impl Rect {
pub fn x(&self, u: f32) -> f32 { self.fy().x(u) } pub fn x(&self, u: f32) -> f32 { self.fy().x(u) }
pub fn u(&self, x: f32) -> f32 { self.fy().u(x) } pub fn u(&self, x: f32) -> f32 { self.fy().u(x) }
pub fn dx(&self, u: f32, du: f32) -> f32 { self.fy().dx(u) * du } pub fn dx(&self, u: f32) -> f32 { self.fy().dx(u) }
pub fn du(&self, x: f32, dx: f32) -> f32 { self.fy().du(x) * dx } pub fn du(&self, x: f32) -> f32 { self.fy().du(x) }
} }
mod fns { mod fns {
@ -728,10 +728,10 @@ fn test_rect() {
assert_abs_diff_eq!(r.u(r.external_halflength), r.internal_halflength, epsilon = 1.0e-5); assert_abs_diff_eq!(r.u(r.external_halflength), r.internal_halflength, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.u(-r.external_halflength), -r.internal_halflength, epsilon = 1.0e-5); assert_abs_diff_eq!(r.u(-r.external_halflength), -r.internal_halflength, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.dx(r.internal_halflength, 3.0), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.dx(r.internal_halflength), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.dx(-r.internal_halflength, 3.0), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.dx(-r.internal_halflength), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.du(r.external_halflength, 3.0), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.du(r.external_halflength), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.du(-r.external_halflength, 3.0), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.du(-r.external_halflength), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.u(r.x(1.0)), 1.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.u(r.x(1.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.u(r.x(5.0)), 5.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.u(r.x(5.0)), 5.0, epsilon = 1.0e-5);
@ -741,14 +741,14 @@ fn test_rect() {
assert_abs_diff_eq!(r.x(r.u(50.0)), 50.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.x(r.u(50.0)), 50.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.x(r.u(-50.0)), -50.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.x(r.u(-50.0)), -50.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.x(r.u(100.0)), 100.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.x(r.u(100.0)), 100.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.du(10.0, r.dx(r.u(10.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.du(10.0) * r.dx(r.u(10.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.du(50.0, r.dx(r.u(50.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.du(50.0) * r.dx(r.u(50.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.du(-50.0, r.dx(r.u(-50.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.du(-50.0) * r.dx(r.u(-50.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.du(100.0, r.dx(r.u(100.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.du(100.0) * r.dx(r.u(100.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.dx(1.0, r.du(r.x(1.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.dx(1.0) * r.du(r.x(1.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.dx(5.0, r.du(r.x(5.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.dx(5.0) * r.du(r.x(5.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.dx(-5.0, r.du(r.x(-5.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.dx(-5.0) * r.du(r.x(-5.0)), 1.0, epsilon = 1.0e-5);
assert_abs_diff_eq!(r.dx(10.0, r.du(r.x(10.0), 3.0)), 3.0, epsilon = 1.0e-5); assert_abs_diff_eq!(r.dx(10.0) * r.du(r.x(10.0)), 1.0, epsilon = 1.0e-5);
} }
trait FloatExt2 { trait FloatExt2 {