From 6e949452965308493d8d5649845c5f1ed86913ce Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 24 Apr 2025 11:10:38 +0200 Subject: [PATCH] Add `AbsoluteCurveGeometry` --- .../2025-03-18/src/extra/triangulate.rs | 13 +++++++++-- experiments/2025-03-18/src/geometry/curve.rs | 4 ++++ experiments/2025-03-18/src/geometry/mod.rs | 2 +- experiments/2025-03-18/src/geometry/sketch.rs | 6 ++++- .../2025-03-18/src/geometry/swept_curve.rs | 22 ++++++++++++------- .../2025-03-18/src/operations/translate.rs | 5 ++++- experiments/2025-03-18/src/topology/curve.rs | 8 ++++--- 7 files changed, 44 insertions(+), 16 deletions(-) diff --git a/experiments/2025-03-18/src/extra/triangulate.rs b/experiments/2025-03-18/src/extra/triangulate.rs index 30a40cf2d..1a3783903 100644 --- a/experiments/2025-03-18/src/extra/triangulate.rs +++ b/experiments/2025-03-18/src/extra/triangulate.rs @@ -113,16 +113,25 @@ fn approximate_half_edge( [&half_edge.start, end_vertex].map(|vertex| vertex.point); let boundary_local = [start, end].map(|point_global| { - half_edge.curve.geometry.project_point(point_global) + half_edge + .curve + .geometry + .geometry + .project_point(point_global) }); let points_local = half_edge .curve .geometry + .geometry .approximate(boundary_local, tolerance); let mut points_global = vec![start]; points_global.extend(points_local.into_iter().map(|point_local| { - half_edge.curve.geometry.point_from_local(point_local) + half_edge + .curve + .geometry + .geometry + .point_from_local(point_local) })); points_global diff --git a/experiments/2025-03-18/src/geometry/curve.rs b/experiments/2025-03-18/src/geometry/curve.rs index 4dc131062..a3537857b 100644 --- a/experiments/2025-03-18/src/geometry/curve.rs +++ b/experiments/2025-03-18/src/geometry/curve.rs @@ -1,6 +1,10 @@ use fj_interop::{CircleApproxParams, Tolerance}; use fj_math::{Circle, Line, Point, Transform, Vector}; +pub struct AbsoluteCurveGeometry { + pub geometry: Box, +} + pub trait CurveGeometry { fn clone_curve_geometry(&self) -> Box; fn point_from_local(&self, point: Point<1>) -> Point<3>; diff --git a/experiments/2025-03-18/src/geometry/mod.rs b/experiments/2025-03-18/src/geometry/mod.rs index a04981e79..5da2d000b 100644 --- a/experiments/2025-03-18/src/geometry/mod.rs +++ b/experiments/2025-03-18/src/geometry/mod.rs @@ -5,6 +5,6 @@ mod swept_curve; mod tri_mesh; pub use self::{ - curve::CurveGeometry, sketch::Sketch, surface::SurfaceGeometry, + curve::AbsoluteCurveGeometry, sketch::Sketch, surface::SurfaceGeometry, swept_curve::SweptCurve, tri_mesh::ToTriMesh, }; diff --git a/experiments/2025-03-18/src/geometry/sketch.rs b/experiments/2025-03-18/src/geometry/sketch.rs index ec4c371e1..6531cd446 100644 --- a/experiments/2025-03-18/src/geometry/sketch.rs +++ b/experiments/2025-03-18/src/geometry/sketch.rs @@ -11,6 +11,8 @@ use crate::{ }, }; +use super::AbsoluteCurveGeometry; + pub struct Sketch { segments: Vec, } @@ -102,7 +104,9 @@ impl Sketch { }; Handle::new(Curve { - geometry: Box::new(circle), + geometry: AbsoluteCurveGeometry { + geometry: Box::new(circle), + }, }) } SketchSegment::Line { .. } => { diff --git a/experiments/2025-03-18/src/geometry/swept_curve.rs b/experiments/2025-03-18/src/geometry/swept_curve.rs index c6c061037..b46997e12 100644 --- a/experiments/2025-03-18/src/geometry/swept_curve.rs +++ b/experiments/2025-03-18/src/geometry/swept_curve.rs @@ -1,9 +1,9 @@ use fj_math::{Line, Point, Vector}; -use super::CurveGeometry; +use super::AbsoluteCurveGeometry; pub struct SweptCurve { - pub curve: Box, + pub curve: AbsoluteCurveGeometry, pub path: Vector<3>, } @@ -18,7 +18,9 @@ impl SweptCurve { let line = Line::from_origin_and_direction(origin, u); Self { - curve: Box::new(line), + curve: AbsoluteCurveGeometry { + geometry: Box::new(line), + }, path: v, } } @@ -34,15 +36,15 @@ impl SweptCurve { pub fn point_from_local(&self, point: impl Into>) -> Point<3> { let [u, v] = point.into().coords.components; - self.curve.point_from_local(Point::from([u])) + self.v() * v + self.curve.geometry.point_from_local(Point::from([u])) + self.v() * v } pub fn project_point(&self, point: impl Into>) -> Point<2> { let point = point.into(); - let u = self.curve.project_point(point); + let u = self.curve.geometry.project_point(point); let v = { - let origin = self.curve.point_from_local(u); + let origin = self.curve.geometry.point_from_local(u); let line = Line::from_origin_and_direction(origin, self.path); line.point_to_line_coords(point) }; @@ -52,14 +54,18 @@ impl SweptCurve { pub fn flip(&self) -> Self { Self { - curve: self.curve.clone_curve_geometry(), + curve: AbsoluteCurveGeometry { + geometry: self.curve.geometry.clone_curve_geometry(), + }, path: -self.path, } } pub fn translate(&self, offset: impl Into>) -> Self { Self { - curve: self.curve.translate(offset.into()), + curve: AbsoluteCurveGeometry { + geometry: self.curve.geometry.translate(offset.into()), + }, path: self.path, } } diff --git a/experiments/2025-03-18/src/operations/translate.rs b/experiments/2025-03-18/src/operations/translate.rs index ef81e0b6c..f4f5986ad 100644 --- a/experiments/2025-03-18/src/operations/translate.rs +++ b/experiments/2025-03-18/src/operations/translate.rs @@ -1,6 +1,7 @@ use fj_math::Vector; use crate::{ + geometry::AbsoluteCurveGeometry, handle::Handle, topology::{ curve::Curve, face::Face, half_edge::HalfEdge, surface::Surface, @@ -15,7 +16,9 @@ pub trait TranslateExt { impl TranslateExt for Curve { fn translate(&self, offset: impl Into>) -> Self { let offset = offset.into(); - let geometry = self.geometry.translate(offset); + let geometry = AbsoluteCurveGeometry { + geometry: self.geometry.geometry.translate(offset), + }; Curve { geometry } } } diff --git a/experiments/2025-03-18/src/topology/curve.rs b/experiments/2025-03-18/src/topology/curve.rs index ff740890d..8b96c4dc2 100644 --- a/experiments/2025-03-18/src/topology/curve.rs +++ b/experiments/2025-03-18/src/topology/curve.rs @@ -1,11 +1,11 @@ use fj_math::Line; -use crate::geometry::CurveGeometry; +use crate::geometry::AbsoluteCurveGeometry; use super::vertex::Vertex; pub struct Curve { - pub geometry: Box, + pub geometry: AbsoluteCurveGeometry, } impl Curve { @@ -14,7 +14,9 @@ impl Curve { let (line, _) = Line::from_points(points); Self { - geometry: Box::new(line), + geometry: AbsoluteCurveGeometry { + geometry: Box::new(line), + }, } } }