Fix a precision issue
This commit is contained in:
parent
122085b9ee
commit
6da6944fa3
|
|
@ -93,7 +93,7 @@ impl YCylinder {
|
||||||
// 2. (ray.pos.x + t * ray.dir.x)² + (ray.pos.z + t * ray.dir.z)² = radius²
|
// 2. (ray.pos.x + t * ray.dir.x)² + (ray.pos.z + t * ray.dir.z)² = radius²
|
||||||
let pos = ray.pos.xz();
|
let pos = ray.pos.xz();
|
||||||
let dir = ray.dir.xz();
|
let dir = ray.dir.xz();
|
||||||
if dir.length_squared() < 1e-3 {
|
if dir.length_squared() < 1e-6 * ray.dir.length_squared() {
|
||||||
if pos.length_squared() >= self.radius.powi(2) {
|
if pos.length_squared() >= self.radius.powi(2) {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
@ -215,6 +215,14 @@ mod tests {
|
||||||
r.trace_into(ray(vec3(1.4142135, -3., 1.4142135), vec3(-1., 1., -1.))),
|
r.trace_into(ray(vec3(1.4142135, -3., 1.4142135), vec3(-1., 1., -1.))),
|
||||||
Some(0.)
|
Some(0.)
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
YCylinder {
|
||||||
|
half_length: 300.,
|
||||||
|
radius: 50.
|
||||||
|
}
|
||||||
|
.trace_into(ray(vec3(-125., 375., 0.), vec3(3., -11., 0.) / 1024.)),
|
||||||
|
Some(25600.)
|
||||||
|
);
|
||||||
|
|
||||||
assert_abs_diff_eq!(
|
assert_abs_diff_eq!(
|
||||||
r.trace_out_of(ray(vec3(0., 0., 0.), vec3(1., 1., 1.))).unwrap(),
|
r.trace_out_of(ray(vec3(0., 0., 0.), vec3(1., 1., 1.))).unwrap(),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user