Add alternative plane intersection in_halfspace function
This commit is contained in:
parent
c4f247f735
commit
4281db12c8
|
@ -126,6 +126,42 @@ impl PlaneIntersection {
|
||||||
dist < math::EPSILON
|
dist < math::EPSILON
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn in_halfspace_gauss(&self, plane: &Plane) -> bool {
|
||||||
|
let mut planes = [
|
||||||
|
self.planes[0].into_vec4(),
|
||||||
|
self.planes[1].into_vec4(),
|
||||||
|
self.planes[2].into_vec4(),
|
||||||
|
plane.into_vec4(),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Range of 3 for x/y/z
|
||||||
|
for i in 0..3 {
|
||||||
|
let pi = planes[i];
|
||||||
|
// Find something to swap with :)
|
||||||
|
if pi[i] == 0.0 {
|
||||||
|
for j in i..3 {
|
||||||
|
// We found something to swap with!
|
||||||
|
if planes[j][i] != 0.0 {
|
||||||
|
planes.swap(i, j);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do our elimination. Include r4 in this!
|
||||||
|
let a = pi[i];
|
||||||
|
for j in (i + 1)..4 {
|
||||||
|
let pj = planes[j];
|
||||||
|
if pj[i] != 0.0 {
|
||||||
|
let b = pj[i];
|
||||||
|
planes[j] = a * pj - b * pi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
planes[3][3] < math::EPSILON
|
||||||
|
}
|
||||||
|
|
||||||
fn get_matrix(&self) -> Mat3 {
|
fn get_matrix(&self) -> Mat3 {
|
||||||
glam::mat3(
|
glam::mat3(
|
||||||
self.planes[0].normal,
|
self.planes[0].normal,
|
||||||
|
@ -217,6 +253,8 @@ mod plane_intersection_tests {
|
||||||
let p1 = Plane::from_point_normal(Vec3::NEG_ONE, Vec3::NEG_ONE);
|
let p1 = Plane::from_point_normal(Vec3::NEG_ONE, Vec3::NEG_ONE);
|
||||||
let p2 = Plane::from_point_normal(Vec3::ZERO, Vec3::ONE);
|
let p2 = Plane::from_point_normal(Vec3::ZERO, Vec3::ONE);
|
||||||
assert!(intersection.in_halfspace_mat(&p1));
|
assert!(intersection.in_halfspace_mat(&p1));
|
||||||
|
assert!(intersection.in_halfspace_gauss(&p1));
|
||||||
assert!(!intersection.in_halfspace_mat(&p2));
|
assert!(!intersection.in_halfspace_mat(&p2));
|
||||||
|
assert!(!intersection.in_halfspace_gauss(&p2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue