summaryrefslogtreecommitdiff
path: root/physics/src/algebra/subspace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'physics/src/algebra/subspace.rs')
-rw-r--r--physics/src/algebra/subspace.rs30
1 files changed, 23 insertions, 7 deletions
diff --git a/physics/src/algebra/subspace.rs b/physics/src/algebra/subspace.rs
index 9fb944e..3d36b52 100644
--- a/physics/src/algebra/subspace.rs
+++ b/physics/src/algebra/subspace.rs
@@ -1,6 +1,6 @@
use nalgebra::SMatrix;
-use super::{Scalar, N, Point, Vector};
+use super::{distance_field::DistanceField, Point, Scalar, Vector, N};
type ProjectionMatrix = SMatrix<Scalar, N, N>;
@@ -36,7 +36,10 @@ impl<const DIM: usize> Subspace<DIM> {
self.projection_matrix * (point - self.point.coords) + self.point.coords
}
- pub fn distance(&self, point: Point) -> Scalar {
+}
+
+impl<const DIM: usize> DistanceField for Subspace<DIM> {
+ fn distance(&self, point: Point) -> Scalar {
let projected = self.project_point(point);
(projected - point).norm()
}
@@ -44,13 +47,13 @@ impl<const DIM: usize> Subspace<DIM> {
#[cfg(test)]
mod tests {
- use crate::algebra::{subspace::Line, Point, Vector};
+ use crate::algebra::{subspace::Line, Point, Vector, distance_field::DistanceField};
#[test]
fn test_projection_onto_line() {
- let line = Line::new(Point::new(1.0, 0.0), [Vector::new(3.0, 1.0)]);
- let point = Point::new(3.0, 4.0);
-
+ let line = Line::new(Point::new(1.0, 0.0, 0.0), [Vector::new(3.0, 1.0, 0.0)]);
+ let point = Point::new(3.0, 4.0, 0.0);
+
let matrix = line.projection_matrix;
{
let diff = matrix * matrix - matrix;
@@ -63,8 +66,21 @@ mod tests {
{
let projected = line.project_point(point);
- let diff = projected - Point::new(4.0, 1.0);
+ let diff = projected - Point::new(4.0, 1.0, 0.0);
assert!(diff.norm() < 0.001, "Point projected incorrectly");
}
}
+
+ #[test]
+ fn test_distance() {
+ let origin = Point::new(0.0, 0.0, 0.0);
+ let line = Line::new(origin, [Vector::x()]);
+
+ let dq = 0.001;
+ let dx = line.distance(origin + Vector::x() * dq);
+ let dy = line.distance(origin + Vector::y() * dq);
+ let dz = line.distance(origin + Vector::z() * dq);
+ assert_eq!(dx, 0.0);
+ assert_eq!(dy, dz);
+ }
}