Add AbsoluteCurveGeometry

This commit is contained in:
Hanno Braun 2025-04-24 11:10:38 +02:00
parent 57898b87fc
commit 6e94945296
7 changed files with 44 additions and 16 deletions

View File

@ -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

View File

@ -1,6 +1,10 @@
use fj_interop::{CircleApproxParams, Tolerance};
use fj_math::{Circle, Line, Point, Transform, Vector};
pub struct AbsoluteCurveGeometry {
pub geometry: Box<dyn CurveGeometry>,
}
pub trait CurveGeometry {
fn clone_curve_geometry(&self) -> Box<dyn CurveGeometry>;
fn point_from_local(&self, point: Point<1>) -> Point<3>;

View File

@ -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,
};

View File

@ -11,6 +11,8 @@ use crate::{
},
};
use super::AbsoluteCurveGeometry;
pub struct Sketch {
segments: Vec<SketchSegment>,
}
@ -102,7 +104,9 @@ impl Sketch {
};
Handle::new(Curve {
geometry: Box::new(circle),
geometry: AbsoluteCurveGeometry {
geometry: Box::new(circle),
},
})
}
SketchSegment::Line { .. } => {

View File

@ -1,9 +1,9 @@
use fj_math::{Line, Point, Vector};
use super::CurveGeometry;
use super::AbsoluteCurveGeometry;
pub struct SweptCurve {
pub curve: Box<dyn CurveGeometry>,
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<2>>) -> 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<3>>) -> 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<Vector<3>>) -> Self {
Self {
curve: self.curve.translate(offset.into()),
curve: AbsoluteCurveGeometry {
geometry: self.curve.geometry.translate(offset.into()),
},
path: self.path,
}
}

View File

@ -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<Vector<3>>) -> Self {
let offset = offset.into();
let geometry = self.geometry.translate(offset);
let geometry = AbsoluteCurveGeometry {
geometry: self.geometry.geometry.translate(offset),
};
Curve { geometry }
}
}

View File

@ -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<dyn CurveGeometry>,
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),
},
}
}
}