Use a different formula to determine right-handedness
This commit is contained in:
@ -464,7 +464,18 @@ impl PlaneInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn is_right_handed(&self) -> bool {
|
pub(crate) fn is_right_handed(&self) -> bool {
|
||||||
self.x_axis.axes_cross_product(&self.y_axis).normalize() == self.z_axis.normalize()
|
// Katie's formula:
|
||||||
|
// dot(cross(x, y), z) ~= sqrt(dot(x, x) * dot(y, y) * dot(z, z))
|
||||||
|
let lhs = self
|
||||||
|
.x_axis
|
||||||
|
.axes_cross_product(&self.y_axis)
|
||||||
|
.axes_dot_product(&self.z_axis);
|
||||||
|
let rhs_x = self.x_axis.axes_dot_product(&self.x_axis);
|
||||||
|
let rhs_y = self.y_axis.axes_dot_product(&self.y_axis);
|
||||||
|
let rhs_z = self.z_axis.axes_dot_product(&self.z_axis);
|
||||||
|
let rhs = (rhs_x * rhs_y * rhs_z).sqrt();
|
||||||
|
// Check LHS ~= RHS
|
||||||
|
(lhs - rhs).abs() <= 0.0001
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@ -943,6 +954,17 @@ impl Point3d {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Calculate the dot product of this vector with another.
|
||||||
|
///
|
||||||
|
/// This should only be applied to axes or other vectors which represent only a direction (and
|
||||||
|
/// no magnitude) since units are ignored.
|
||||||
|
pub fn axes_dot_product(&self, other: &Self) -> f64 {
|
||||||
|
let x = self.x * other.x;
|
||||||
|
let y = self.y * other.y;
|
||||||
|
let z = self.z * other.z;
|
||||||
|
x + y + z
|
||||||
|
}
|
||||||
|
|
||||||
pub fn normalize(&self) -> Self {
|
pub fn normalize(&self) -> Self {
|
||||||
let len = f64::sqrt(self.x * self.x + self.y * self.y + self.z * self.z);
|
let len = f64::sqrt(self.x * self.x + self.y * self.y + self.z * self.z);
|
||||||
Point3d {
|
Point3d {
|
||||||
|
Reference in New Issue
Block a user