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
|
||||
}
|
||||
|
||||
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 {
|
||||
glam::mat3(
|
||||
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 p2 = Plane::from_point_normal(Vec3::ZERO, Vec3::ONE);
|
||||
assert!(intersection.in_halfspace_mat(&p1));
|
||||
assert!(intersection.in_halfspace_gauss(&p1));
|
||||
assert!(!intersection.in_halfspace_mat(&p2));
|
||||
assert!(!intersection.in_halfspace_gauss(&p2));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue