Merge pull request #2399 from hannobraun/build

Clean up in build operations
This commit is contained in:
Hanno Braun 2024-06-26 19:05:31 +02:00 committed by GitHub
commit d906b5327d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 20 additions and 28 deletions

View File

@ -2,7 +2,7 @@ use fj_math::{Point, Scalar, Vector};
use itertools::Itertools;
use crate::{
operations::{build::BuildHalfEdge, insert::Insert, update::UpdateCycle},
operations::build::BuildHalfEdge,
storage::Handle,
topology::{Cycle, HalfEdge, Surface},
Core,
@ -54,12 +54,14 @@ pub trait BuildCycle {
let angle = Scalar::TAU / 4.;
let ab = HalfEdge::arc(a, b, angle, surface.clone(), core).insert(core);
let bc = HalfEdge::arc(b, c, angle, surface.clone(), core).insert(core);
let cd = HalfEdge::arc(c, d, angle, surface.clone(), core).insert(core);
let da = HalfEdge::arc(d, a, angle, surface.clone(), core).insert(core);
let half_edges =
[[a, b], [b, c], [c, d], [d, a]]
.into_iter()
.map(|[start, end]| {
HalfEdge::arc(start, end, angle, surface.clone(), core)
});
Cycle::empty().add_half_edges([ab, bc, cd, da], core)
Cycle::new(half_edges)
}
/// Build a polygon
@ -73,20 +75,15 @@ pub trait BuildCycle {
Ps: IntoIterator<Item = P>,
Ps::IntoIter: Clone + ExactSizeIterator,
{
let edges = points
let half_edges = points
.into_iter()
.map(Into::into)
.circular_tuple_windows()
.map(|(start, end)| {
HalfEdge::line_segment(
[start, end],
None,
surface.clone(),
core,
)
HalfEdge::line_segment([start, end], surface.clone(), core)
});
Cycle::new(edges)
Cycle::new(half_edges)
}
}

View File

@ -83,10 +83,11 @@ pub trait BuildHalfEdge {
/// Create a line segment
fn line_segment(
points_surface: [impl Into<Point<2>>; 2],
boundary: Option<CurveBoundary<Point<1>>>,
surface: Handle<Surface>,
core: &mut Core,
) -> Handle<HalfEdge> {
let boundary = CurveBoundary::default();
let half_edge = HalfEdge::unjoined(core).insert(core);
half_edge.curve().clone().make_line_on_surface(
@ -96,12 +97,9 @@ pub trait BuildHalfEdge {
&mut core.layers.geometry,
);
core.layers.geometry.define_half_edge(
half_edge.clone(),
HalfEdgeGeom {
boundary: boundary.unwrap_or_default(),
},
);
core.layers
.geometry
.define_half_edge(half_edge.clone(), HalfEdgeGeom { boundary });
half_edge
}

View File

@ -92,7 +92,7 @@ pub trait BuildShell {
let curve = curve.make_line_on_surface(
positions,
Some(boundary),
boundary,
surface.clone(),
&mut core.layers.geometry,
);

View File

@ -35,7 +35,7 @@ pub trait UpdateCurveGeometry {
fn make_line_on_surface(
self,
points_surface: [impl Into<Point<2>>; 2],
points_curve: Option<CurveBoundary<Point<1>>>,
points_curve: CurveBoundary<Point<1>>,
surface: Handle<Surface>,
geometry: &mut Layer<Geometry>,
) -> Self;
@ -71,11 +71,10 @@ impl UpdateCurveGeometry for Handle<Curve> {
fn make_line_on_surface(
self,
points_surface: [impl Into<Point<2>>; 2],
points_curve: Option<CurveBoundary<Point<1>>>,
points_curve: CurveBoundary<Point<1>>,
surface: Handle<Surface>,
geometry: &mut Layer<Geometry>,
) -> Self {
let points_curve = points_curve.unwrap_or_default();
let path = SurfacePath::line_from_points_with_coords(
points_curve.inner.zip_ext(points_surface),
);

View File

@ -126,7 +126,6 @@ impl SplitFace for Shell {
.path,
),
],
None,
face.surface().clone(),
core,
);

View File

@ -133,7 +133,7 @@ impl SweepHalfEdge for Handle<HalfEdge> {
.unwrap_or_else(|| Curve::new().insert(core))
.make_line_on_surface(
[start, end],
Some(boundary),
boundary,
surface.clone(),
&mut core.layers.geometry,
);

View File

@ -180,7 +180,6 @@ mod tests {
|_, core| {
[HalfEdge::line_segment(
[[0., 0.], [2., 0.]],
None,
surface,
core,
)]