From f81cb922b9751d3c741834433bc456f4d02e6dd8 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Mon, 28 Apr 2025 14:08:54 +0200 Subject: [PATCH] Prepare to support curved sweeps --- experiments/2025-03-18/src/geometry/curve.rs | 14 ++++++++++++++ .../2025-03-18/src/geometry/swept_curve.rs | 19 +++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/experiments/2025-03-18/src/geometry/curve.rs b/experiments/2025-03-18/src/geometry/curve.rs index a72ffeeaa..03b8abc4b 100644 --- a/experiments/2025-03-18/src/geometry/curve.rs +++ b/experiments/2025-03-18/src/geometry/curve.rs @@ -81,6 +81,7 @@ pub trait CurveGeometry { fn clone_curve_geometry(&self) -> FloatingCurve; fn vector_from_local_point(&self, point: Point<1>) -> Vector<3>; fn project_vector(&self, vector: Vector<3>) -> Point<1>; + fn flip(&self) -> FloatingCurve; /// # Approximate the curve /// @@ -107,6 +108,13 @@ impl CurveGeometry for Circle { self.project_vector(vector) } + fn flip(&self) -> FloatingCurve { + Box::new(Circle { + a: self.a, + b: -self.b, + }) + } + fn approximate( &self, boundary: [Point<1>; 2], @@ -131,6 +139,12 @@ impl CurveGeometry for Line { self.project_vector(vector) } + fn flip(&self) -> FloatingCurve { + Box::new(Line { + direction: -self.direction, + }) + } + fn approximate(&self, _: [Point<1>; 2], _: Tolerance) -> Vec> { vec![] } diff --git a/experiments/2025-03-18/src/geometry/swept_curve.rs b/experiments/2025-03-18/src/geometry/swept_curve.rs index b4e80cde5..fe3fca2e6 100644 --- a/experiments/2025-03-18/src/geometry/swept_curve.rs +++ b/experiments/2025-03-18/src/geometry/swept_curve.rs @@ -1,10 +1,10 @@ use fj_math::{Point, Vector}; -use super::{AnchoredCurve, Line}; +use super::{AnchoredCurve, Line, curve::FloatingCurve}; pub struct SweptCurve { pub u: AnchoredCurve, - pub v: Vector<3>, + pub v: FloatingCurve, } impl SweptCurve { @@ -20,7 +20,7 @@ impl SweptCurve { origin, floating: Box::new(u), }, - v: v.direction, + v: Box::new(v), } } @@ -31,7 +31,8 @@ impl SweptCurve { pub fn point_from_local(&self, point: impl Into>) -> Point<3> { let [u, v] = point.into().coords.components; - self.u.point_from_local([u]) + self.v * v + self.u.point_from_local([u]) + + self.v.vector_from_local_point(Point::from([v])) } pub fn project_point(&self, point: impl Into>) -> Point<2> { @@ -40,8 +41,10 @@ impl SweptCurve { let u = self.u.project_point(point); let v = { let origin = self.u.point_from_local(u); - let line = - AnchoredCurve::line_from_origin_and_direction(origin, self.v); + let line = AnchoredCurve { + origin, + floating: self.v.clone_curve_geometry(), + }; line.project_point(point) }; @@ -52,14 +55,14 @@ impl SweptCurve { pub fn flip(&self) -> Self { Self { u: self.u.clone(), - v: -self.v, + v: self.v.flip(), } } pub fn translate(&self, offset: impl Into>) -> Self { Self { u: self.u.translate(offset), - v: self.v, + v: self.v.clone_curve_geometry(), } } }