mirror of
https://github.com/hannobraun/Fornjot
synced 2025-05-05 10:28:27 +00:00
Add AbsoluteCurveGeometry
This commit is contained in:
parent
57898b87fc
commit
6e94945296
@ -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
|
||||
|
@ -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>;
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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 { .. } => {
|
||||
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
@ -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 }
|
||||
}
|
||||
}
|
||||
|
@ -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),
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user