mirror of
https://github.com/hannobraun/Fornjot
synced 2025-08-16 14:16:07 +00:00
Merge pull request #2287 from hannobraun/geometry
Add redundant definition of `HalfEdge`'s `CurveBoundary` to geometry layer
This commit is contained in:
commit
2ebc613a92
@ -31,7 +31,7 @@ impl Approx for (&Handle<HalfEdge>, &SurfaceGeometry) {
|
|||||||
.layers
|
.layers
|
||||||
.geometry
|
.geometry
|
||||||
.of_half_edge(half_edge)
|
.of_half_edge(half_edge)
|
||||||
.start_position(half_edge.boundary());
|
.start_position();
|
||||||
let start_position =
|
let start_position =
|
||||||
match cache.start_position.get(half_edge.start_vertex()) {
|
match cache.start_position.get(half_edge.start_vertex()) {
|
||||||
Some(position) => position,
|
Some(position) => position,
|
||||||
|
@ -31,19 +31,28 @@ pub struct HalfEdgeGeometry {
|
|||||||
/// really belong here. It exists here for practical reasons that are,
|
/// really belong here. It exists here for practical reasons that are,
|
||||||
/// hopefully, temporary.
|
/// hopefully, temporary.
|
||||||
pub path: SurfacePath,
|
pub path: SurfacePath,
|
||||||
|
|
||||||
|
/// # The boundary of the half-edge on its curve
|
||||||
|
pub boundary: CurveBoundary<Point<1>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HalfEdgeGeometry {
|
impl HalfEdgeGeometry {
|
||||||
|
/// Update the boundary
|
||||||
|
pub fn with_boundary(
|
||||||
|
mut self,
|
||||||
|
boundary: impl Into<CurveBoundary<Point<1>>>,
|
||||||
|
) -> Self {
|
||||||
|
self.boundary = boundary.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Compute the surface position where the half-edge starts
|
/// Compute the surface position where the half-edge starts
|
||||||
pub fn start_position(
|
pub fn start_position(&self) -> Point<2> {
|
||||||
&self,
|
|
||||||
boundary: CurveBoundary<Point<1>>,
|
|
||||||
) -> Point<2> {
|
|
||||||
// Computing the surface position from the curve position is fine.
|
// Computing the surface position from the curve position is fine.
|
||||||
// `HalfEdge` "owns" its start position. There is no competing code that
|
// `HalfEdge` "owns" its start position. There is no competing code that
|
||||||
// could compute the surface position from slightly different data.
|
// could compute the surface position from slightly different data.
|
||||||
|
|
||||||
let [start, _] = boundary.inner;
|
let [start, _] = self.boundary.inner;
|
||||||
self.path.point_from_path_coords(start)
|
self.path.point_from_path_coords(start)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,9 +66,7 @@ impl Cycle {
|
|||||||
|
|
||||||
for (a, b) in self.half_edges().pairs() {
|
for (a, b) in self.half_edges().pairs() {
|
||||||
let [a, b] = [a, b].map(|half_edge| {
|
let [a, b] = [a, b].map(|half_edge| {
|
||||||
geometry
|
geometry.of_half_edge(half_edge).start_position()
|
||||||
.of_half_edge(half_edge)
|
|
||||||
.start_position(half_edge.boundary())
|
|
||||||
});
|
});
|
||||||
|
|
||||||
sum += (b.u - a.u) * (b.v + a.v);
|
sum += (b.u - a.u) * (b.v + a.v);
|
||||||
|
@ -32,16 +32,16 @@ pub trait BuildHalfEdge {
|
|||||||
start_vertex: Handle<Vertex>,
|
start_vertex: Handle<Vertex>,
|
||||||
core: &mut Core,
|
core: &mut Core,
|
||||||
) -> Handle<HalfEdge> {
|
) -> Handle<HalfEdge> {
|
||||||
|
let mut geometry = core.layers.geometry.of_half_edge(sibling);
|
||||||
|
geometry.boundary = geometry.boundary.reverse();
|
||||||
|
|
||||||
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(
|
.set_geometry(geometry, &mut core.layers.geometry)
|
||||||
core.layers.geometry.of_half_edge(sibling),
|
|
||||||
&mut core.layers.geometry,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create an arc
|
/// Create an arc
|
||||||
@ -68,9 +68,13 @@ pub trait BuildHalfEdge {
|
|||||||
[arc.start_angle, arc.end_angle].map(|coord| Point::from([coord]));
|
[arc.start_angle, arc.end_angle].map(|coord| Point::from([coord]));
|
||||||
|
|
||||||
let half_edge = HalfEdge::unjoined(boundary, core).insert(core);
|
let half_edge = HalfEdge::unjoined(boundary, core).insert(core);
|
||||||
core.layers
|
core.layers.geometry.define_half_edge(
|
||||||
.geometry
|
half_edge.clone(),
|
||||||
.define_half_edge(half_edge.clone(), HalfEdgeGeometry { path });
|
HalfEdgeGeometry {
|
||||||
|
path,
|
||||||
|
boundary: boundary.into(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
half_edge
|
half_edge
|
||||||
}
|
}
|
||||||
@ -86,9 +90,13 @@ pub trait BuildHalfEdge {
|
|||||||
[Scalar::ZERO, Scalar::TAU].map(|coord| Point::from([coord]));
|
[Scalar::ZERO, Scalar::TAU].map(|coord| Point::from([coord]));
|
||||||
|
|
||||||
let half_edge = HalfEdge::unjoined(boundary, core).insert(core);
|
let half_edge = HalfEdge::unjoined(boundary, core).insert(core);
|
||||||
core.layers
|
core.layers.geometry.define_half_edge(
|
||||||
.geometry
|
half_edge.clone(),
|
||||||
.define_half_edge(half_edge.clone(), HalfEdgeGeometry { path });
|
HalfEdgeGeometry {
|
||||||
|
path,
|
||||||
|
boundary: boundary.into(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
half_edge
|
half_edge
|
||||||
}
|
}
|
||||||
@ -107,7 +115,13 @@ pub trait BuildHalfEdge {
|
|||||||
|
|
||||||
HalfEdge::unjoined(boundary, core)
|
HalfEdge::unjoined(boundary, core)
|
||||||
.insert(core)
|
.insert(core)
|
||||||
.set_geometry(HalfEdgeGeometry { path }, &mut core.layers.geometry)
|
.set_geometry(
|
||||||
|
HalfEdgeGeometry {
|
||||||
|
path,
|
||||||
|
boundary: boundary.into(),
|
||||||
|
},
|
||||||
|
&mut core.layers.geometry,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ impl JoinCycle for Cycle {
|
|||||||
)
|
)
|
||||||
.insert(core)
|
.insert(core)
|
||||||
.set_geometry(
|
.set_geometry(
|
||||||
HalfEdgeGeometry { path },
|
HalfEdgeGeometry { path, boundary },
|
||||||
&mut core.layers.geometry,
|
&mut core.layers.geometry,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
@ -14,6 +14,9 @@ impl Reverse for Cycle {
|
|||||||
.half_edges()
|
.half_edges()
|
||||||
.pairs()
|
.pairs()
|
||||||
.map(|(current, next)| {
|
.map(|(current, next)| {
|
||||||
|
let mut geometry = core.layers.geometry.of_half_edge(current);
|
||||||
|
geometry.boundary = geometry.boundary.reverse();
|
||||||
|
|
||||||
HalfEdge::new(
|
HalfEdge::new(
|
||||||
current.boundary().reverse(),
|
current.boundary().reverse(),
|
||||||
current.curve().clone(),
|
current.curve().clone(),
|
||||||
@ -21,10 +24,7 @@ impl Reverse for Cycle {
|
|||||||
)
|
)
|
||||||
.insert(core)
|
.insert(core)
|
||||||
.derive_from(current, core)
|
.derive_from(current, core)
|
||||||
.set_geometry(
|
.set_geometry(geometry, &mut core.layers.geometry)
|
||||||
core.layers.geometry.of_half_edge(current),
|
|
||||||
&mut core.layers.geometry,
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
geometry::HalfEdgeGeometry,
|
|
||||||
objects::HalfEdge,
|
objects::HalfEdge,
|
||||||
operations::{derive::DeriveFrom, insert::Insert},
|
operations::{derive::DeriveFrom, insert::Insert},
|
||||||
storage::Handle,
|
storage::Handle,
|
||||||
@ -10,11 +9,12 @@ use super::ReverseCurveCoordinateSystems;
|
|||||||
|
|
||||||
impl ReverseCurveCoordinateSystems for Handle<HalfEdge> {
|
impl ReverseCurveCoordinateSystems for Handle<HalfEdge> {
|
||||||
fn reverse_curve_coordinate_systems(&self, core: &mut Core) -> Self {
|
fn reverse_curve_coordinate_systems(&self, core: &mut Core) -> Self {
|
||||||
let path = core.layers.geometry.of_half_edge(self).path.reverse();
|
let mut geometry = core.layers.geometry.of_half_edge(self);
|
||||||
let boundary = self.boundary().reverse();
|
geometry.path = geometry.path.reverse();
|
||||||
|
geometry.boundary = geometry.boundary.reverse();
|
||||||
|
|
||||||
let half_edge = HalfEdge::new(
|
let half_edge = HalfEdge::new(
|
||||||
boundary,
|
geometry.boundary,
|
||||||
self.curve().clone(),
|
self.curve().clone(),
|
||||||
self.start_vertex().clone(),
|
self.start_vertex().clone(),
|
||||||
)
|
)
|
||||||
@ -23,7 +23,7 @@ impl ReverseCurveCoordinateSystems for Handle<HalfEdge> {
|
|||||||
|
|
||||||
core.layers
|
core.layers
|
||||||
.geometry
|
.geometry
|
||||||
.define_half_edge(half_edge.clone(), HalfEdgeGeometry { path });
|
.define_half_edge(half_edge.clone(), geometry);
|
||||||
|
|
||||||
half_edge
|
half_edge
|
||||||
}
|
}
|
||||||
|
@ -105,14 +105,8 @@ impl SplitFace for Shell {
|
|||||||
let dividing_half_edge_a_to_d = {
|
let dividing_half_edge_a_to_d = {
|
||||||
let half_edge = HalfEdge::line_segment(
|
let half_edge = HalfEdge::line_segment(
|
||||||
[
|
[
|
||||||
core.layers
|
core.layers.geometry.of_half_edge(&b).start_position(),
|
||||||
.geometry
|
core.layers.geometry.of_half_edge(&d).start_position(),
|
||||||
.of_half_edge(&b)
|
|
||||||
.start_position(b.boundary()),
|
|
||||||
core.layers
|
|
||||||
.geometry
|
|
||||||
.of_half_edge(&d)
|
|
||||||
.start_position(d.boundary()),
|
|
||||||
],
|
],
|
||||||
None,
|
None,
|
||||||
core,
|
core,
|
||||||
|
@ -2,7 +2,9 @@ use fj_math::Point;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
objects::{HalfEdge, Vertex},
|
objects::{HalfEdge, Vertex},
|
||||||
operations::{derive::DeriveFrom, insert::Insert},
|
operations::{
|
||||||
|
derive::DeriveFrom, geometry::UpdateHalfEdgeGeometry, insert::Insert,
|
||||||
|
},
|
||||||
storage::Handle,
|
storage::Handle,
|
||||||
Core,
|
Core,
|
||||||
};
|
};
|
||||||
@ -48,22 +50,27 @@ impl SplitHalfEdge for Handle<HalfEdge> {
|
|||||||
self.start_vertex().clone(),
|
self.start_vertex().clone(),
|
||||||
)
|
)
|
||||||
.insert(core)
|
.insert(core)
|
||||||
.derive_from(self, core);
|
.derive_from(self, core)
|
||||||
|
.set_geometry(
|
||||||
|
core.layers
|
||||||
|
.geometry
|
||||||
|
.of_half_edge(self)
|
||||||
|
.with_boundary([start, point]),
|
||||||
|
&mut core.layers.geometry,
|
||||||
|
);
|
||||||
let b = HalfEdge::new(
|
let b = HalfEdge::new(
|
||||||
[point, end],
|
[point, end],
|
||||||
self.curve().clone(),
|
self.curve().clone(),
|
||||||
Vertex::new().insert(core),
|
Vertex::new().insert(core),
|
||||||
)
|
)
|
||||||
.insert(core)
|
.insert(core)
|
||||||
.derive_from(self, core);
|
.derive_from(self, core)
|
||||||
|
.set_geometry(
|
||||||
core.layers.geometry.define_half_edge(
|
core.layers
|
||||||
a.clone(),
|
.geometry
|
||||||
core.layers.geometry.of_half_edge(self),
|
.of_half_edge(self)
|
||||||
);
|
.with_boundary([point, end]),
|
||||||
core.layers.geometry.define_half_edge(
|
&mut core.layers.geometry,
|
||||||
b.clone(),
|
|
||||||
core.layers.geometry.of_half_edge(self),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
[a, b]
|
[a, b]
|
||||||
|
@ -450,6 +450,8 @@ mod tests {
|
|||||||
.geometry
|
.geometry
|
||||||
.of_half_edge(half_edge);
|
.of_half_edge(half_edge);
|
||||||
geometry.path = geometry.path.reverse();
|
geometry.path = geometry.path.reverse();
|
||||||
|
geometry.boundary =
|
||||||
|
geometry.boundary.reverse();
|
||||||
|
|
||||||
[HalfEdge::new(
|
[HalfEdge::new(
|
||||||
half_edge.boundary().reverse(),
|
half_edge.boundary().reverse(),
|
||||||
|
@ -93,7 +93,7 @@ impl SolidValidationError {
|
|||||||
.map(|(h, s)| {
|
.map(|(h, s)| {
|
||||||
(
|
(
|
||||||
s.point_from_surface_coords(
|
s.point_from_surface_coords(
|
||||||
geometry.of_half_edge(&h).start_position(h.boundary()),
|
geometry.of_half_edge(&h).start_position(),
|
||||||
),
|
),
|
||||||
h.start_vertex().clone(),
|
h.start_vertex().clone(),
|
||||||
)
|
)
|
||||||
|
@ -52,9 +52,8 @@ impl ValidationCheck<Cycle> for AdjacentHalfEdgesNotConnected {
|
|||||||
.path
|
.path
|
||||||
.point_from_path_coords(end)
|
.point_from_path_coords(end)
|
||||||
};
|
};
|
||||||
let start_pos_of_second_half_edge = geometry
|
let start_pos_of_second_half_edge =
|
||||||
.of_half_edge(second)
|
geometry.of_half_edge(second).start_position();
|
||||||
.start_position(second.boundary());
|
|
||||||
|
|
||||||
let distance_between_positions = (end_pos_of_first_half_edge
|
let distance_between_positions = (end_pos_of_first_half_edge
|
||||||
- start_pos_of_second_half_edge)
|
- start_pos_of_second_half_edge)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user