From acd13fd925c7fad76af9339657fb275ae8e3f47e Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 9 Jan 2025 18:52:54 +0100 Subject: [PATCH] Add `Plane::project_point` --- experiments/2024-12-09/src/math/plane.rs | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/experiments/2024-12-09/src/math/plane.rs b/experiments/2024-12-09/src/math/plane.rs index 13f468c8f..98ebdc274 100644 --- a/experiments/2024-12-09/src/math/plane.rs +++ b/experiments/2024-12-09/src/math/plane.rs @@ -25,6 +25,22 @@ impl Plane { self.origin + self.coords.a * u + self.coords.b * v } + #[allow(unused)] // code to use it is being worked on + pub fn project_point(&self, point: impl Into>) -> Point<2> { + let point = point.into(); + let origin_to_point = point - self.origin; + + let min_distance_plane_to_point = origin_to_point.dot(&self.normal()); + let point_in_plane = + point - self.normal() * min_distance_plane_to_point; + let origin_to_point_in_plane = point_in_plane - self.origin; + + let u = origin_to_point_in_plane.dot(&self.u()); + let v = origin_to_point_in_plane.dot(&self.v()); + + Point::from([u, v]) + } + pub fn translate(self, offset: impl Into>) -> Self { Self { origin: self.origin + offset, @@ -32,3 +48,23 @@ impl Plane { } } } + +#[cfg(test)] +mod tests { + use crate::math::{Bivector, Point, Vector}; + + use super::Plane; + + #[test] + fn project_point() { + let plane = Plane { + origin: Point::from([1., 1., 1.]), + coords: Bivector { + a: Vector::from([1., 0., 0.]), + b: Vector::from([0., 1., 0.]), + }, + }; + + assert_eq!(plane.project_point([2., 2., 2.]), Point::from([1., 1.])); + } +}