Merge pull request #2286 from hannobraun/geometry

Simplify how half-edge geometry is set
This commit is contained in:
Hanno Braun 2024-03-23 01:27:13 +01:00 committed by GitHub
commit 4b74964372
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 53 additions and 64 deletions

View File

@ -32,21 +32,16 @@ pub trait BuildHalfEdge {
start_vertex: Handle<Vertex>, start_vertex: Handle<Vertex>,
core: &mut Core, core: &mut Core,
) -> Handle<HalfEdge> { ) -> Handle<HalfEdge> {
let half_edge = HalfEdge::new( HalfEdge::new(
sibling.boundary().reverse(), sibling.boundary().reverse(),
sibling.curve().clone(), sibling.curve().clone(),
start_vertex, start_vertex,
) )
.insert(core); .insert(core)
.set_geometry(
core.layers.geometry.define_half_edge( core.layers.geometry.of_half_edge(sibling),
half_edge.clone(), &mut core.layers.geometry,
HalfEdgeGeometry { )
path: core.layers.geometry.of_half_edge(sibling).path,
},
);
half_edge
} }
/// Create an arc /// Create an arc
@ -112,7 +107,7 @@ pub trait BuildHalfEdge {
HalfEdge::unjoined(boundary, core) HalfEdge::unjoined(boundary, core)
.insert(core) .insert(core)
.set_path(path, &mut core.layers.geometry) .set_geometry(HalfEdgeGeometry { path }, &mut core.layers.geometry)
} }
} }

View File

@ -101,11 +101,10 @@ pub trait BuildShell {
.update_start_vertex(|_, _| vertex, core) .update_start_vertex(|_, _| vertex, core)
.update_curve(|_, _| curve, core) .update_curve(|_, _| curve, core)
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers core.layers
.geometry .geometry
.of_half_edge(&half_edge) .of_half_edge(&half_edge),
.path,
&mut core.layers.geometry, &mut core.layers.geometry,
) )
}) })

View File

@ -1,5 +1,5 @@
use crate::{ use crate::{
geometry::{Geometry, HalfEdgeGeometry, SurfacePath}, geometry::{Geometry, HalfEdgeGeometry},
layers::Layer, layers::Layer,
objects::HalfEdge, objects::HalfEdge,
storage::Handle, storage::Handle,
@ -8,20 +8,20 @@ use crate::{
/// Update the geometry of a [`HalfEdge`] /// Update the geometry of a [`HalfEdge`]
pub trait UpdateHalfEdgeGeometry { pub trait UpdateHalfEdgeGeometry {
/// Set the path of the half-edge /// Set the path of the half-edge
fn set_path( fn set_geometry(
self, self,
path: SurfacePath, geometry: HalfEdgeGeometry,
geometry: &mut Layer<Geometry>, layer: &mut Layer<Geometry>,
) -> Self; ) -> Self;
} }
impl UpdateHalfEdgeGeometry for Handle<HalfEdge> { impl UpdateHalfEdgeGeometry for Handle<HalfEdge> {
fn set_path( fn set_geometry(
self, self,
path: SurfacePath, geometry: HalfEdgeGeometry,
geometry: &mut Layer<Geometry>, layer: &mut Layer<Geometry>,
) -> Self { ) -> Self {
geometry.define_half_edge(self.clone(), HalfEdgeGeometry { path }); layer.define_half_edge(self.clone(), geometry);
self self
} }
} }

View File

@ -4,7 +4,7 @@ use fj_math::Point;
use itertools::Itertools; use itertools::Itertools;
use crate::{ use crate::{
geometry::{CurveBoundary, SurfacePath}, geometry::{CurveBoundary, HalfEdgeGeometry, SurfacePath},
objects::{Cycle, HalfEdge}, objects::{Cycle, HalfEdge},
operations::{ operations::{
build::BuildHalfEdge, build::BuildHalfEdge,
@ -97,7 +97,10 @@ impl JoinCycle for Cycle {
core, core,
) )
.insert(core) .insert(core)
.set_path(path, &mut core.layers.geometry) .set_geometry(
HalfEdgeGeometry { path },
&mut core.layers.geometry,
)
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
self.add_half_edges(half_edges, core) self.add_half_edges(half_edges, core)
@ -141,11 +144,10 @@ impl JoinCycle for Cycle {
core, core,
) )
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers core.layers
.geometry .geometry
.of_half_edge(half_edge) .of_half_edge(half_edge),
.path,
&mut core.layers.geometry, &mut core.layers.geometry,
)] )]
}, },
@ -160,11 +162,10 @@ impl JoinCycle for Cycle {
core, core,
) )
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers core.layers
.geometry .geometry
.of_half_edge(half_edge) .of_half_edge(half_edge),
.path,
&mut core.layers.geometry, &mut core.layers.geometry,
)] )]
}, },

View File

@ -14,8 +14,6 @@ impl Reverse for Cycle {
.half_edges() .half_edges()
.pairs() .pairs()
.map(|(current, next)| { .map(|(current, next)| {
let path = core.layers.geometry.of_half_edge(current).path;
HalfEdge::new( HalfEdge::new(
current.boundary().reverse(), current.boundary().reverse(),
current.curve().clone(), current.curve().clone(),
@ -23,7 +21,10 @@ impl Reverse for Cycle {
) )
.insert(core) .insert(core)
.derive_from(current, core) .derive_from(current, core)
.set_path(path, &mut core.layers.geometry) .set_geometry(
core.layers.geometry.of_half_edge(current),
&mut core.layers.geometry,
)
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();

View File

@ -50,8 +50,8 @@ impl SplitEdge for Shell {
core, core,
) )
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers.geometry.of_half_edge(&sibling_b).path, core.layers.geometry.of_half_edge(&sibling_b),
&mut core.layers.geometry, &mut core.layers.geometry,
); );

View File

@ -120,8 +120,8 @@ impl SplitFace for Shell {
half_edge half_edge
.update_start_vertex(|_, _| b.start_vertex().clone(), core) .update_start_vertex(|_, _| b.start_vertex().clone(), core)
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers.geometry.of_half_edge(&half_edge).path, core.layers.geometry.of_half_edge(&half_edge),
&mut core.layers.geometry, &mut core.layers.geometry,
) )
}; };

View File

@ -1,7 +1,6 @@
use fj_math::Point; use fj_math::Point;
use crate::{ use crate::{
geometry::HalfEdgeGeometry,
objects::{HalfEdge, Vertex}, objects::{HalfEdge, Vertex},
operations::{derive::DeriveFrom, insert::Insert}, operations::{derive::DeriveFrom, insert::Insert},
storage::Handle, storage::Handle,
@ -60,15 +59,11 @@ impl SplitHalfEdge for Handle<HalfEdge> {
core.layers.geometry.define_half_edge( core.layers.geometry.define_half_edge(
a.clone(), a.clone(),
HalfEdgeGeometry { core.layers.geometry.of_half_edge(self),
path: core.layers.geometry.of_half_edge(self).path,
},
); );
core.layers.geometry.define_half_edge( core.layers.geometry.define_half_edge(
b.clone(), b.clone(),
HalfEdgeGeometry { core.layers.geometry.of_half_edge(self),
path: core.layers.geometry.of_half_edge(self).path,
},
); );
[a, b] [a, b]

View File

@ -134,8 +134,8 @@ impl SweepHalfEdge for Handle<HalfEdge> {
half_edge half_edge
}; };
half_edge.insert(core).set_path( half_edge.insert(core).set_geometry(
core.layers.geometry.of_half_edge(&line_segment).path, core.layers.geometry.of_half_edge(&line_segment),
&mut core.layers.geometry, &mut core.layers.geometry,
) )
}; };

View File

@ -1,8 +1,7 @@
use fj_math::Transform; use fj_math::Transform;
use crate::{ use crate::{
geometry::HalfEdgeGeometry, objects::HalfEdge, operations::insert::Insert, objects::HalfEdge, operations::insert::Insert, storage::Handle, Core,
storage::Handle, Core,
}; };
use super::{TransformCache, TransformObject}; use super::{TransformCache, TransformObject};
@ -14,9 +13,6 @@ impl TransformObject for Handle<HalfEdge> {
core: &mut Core, core: &mut Core,
cache: &mut TransformCache, cache: &mut TransformCache,
) -> Self { ) -> Self {
// Don't need to transform the path, as that's defined in surface
// coordinates.
let path = core.layers.geometry.of_half_edge(self).path;
let boundary = self.boundary(); let boundary = self.boundary();
let curve = self let curve = self
.curve() .curve()
@ -30,9 +26,10 @@ impl TransformObject for Handle<HalfEdge> {
let half_edge = let half_edge =
HalfEdge::new(boundary, curve, start_vertex).insert(core); HalfEdge::new(boundary, curve, start_vertex).insert(core);
core.layers core.layers.geometry.define_half_edge(
.geometry half_edge.clone(),
.define_half_edge(half_edge.clone(), HalfEdgeGeometry { path }); core.layers.geometry.of_half_edge(self),
);
half_edge half_edge
} }

View File

@ -445,18 +445,20 @@ mod tests {
cycle.update_half_edge( cycle.update_half_edge(
cycle.half_edges().nth_circular(0), cycle.half_edges().nth_circular(0),
|half_edge, core| { |half_edge, core| {
let mut geometry = core
.layers
.geometry
.of_half_edge(half_edge);
geometry.path = geometry.path.reverse();
[HalfEdge::new( [HalfEdge::new(
half_edge.boundary().reverse(), half_edge.boundary().reverse(),
half_edge.curve().clone(), half_edge.curve().clone(),
half_edge.start_vertex().clone(), half_edge.start_vertex().clone(),
) )
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers geometry,
.geometry
.of_half_edge(half_edge)
.path
.reverse(),
&mut core.layers.geometry, &mut core.layers.geometry,
)] )]
}, },
@ -534,11 +536,10 @@ mod tests {
core, core,
) )
.insert(core) .insert(core)
.set_path( .set_geometry(
core.layers core.layers
.geometry .geometry
.of_half_edge(half_edge) .of_half_edge(half_edge),
.path,
&mut core.layers.geometry, &mut core.layers.geometry,
)] )]
}, },