Require end vertex to reverse HalfEdge coords

This is preparation for updating the vertex geometry in that code.
This commit is contained in:
Hanno Braun 2024-06-27 21:24:21 +02:00
parent 8defcab4bf
commit 3897826b5c
2 changed files with 161 additions and 109 deletions

View File

@ -183,7 +183,14 @@ pub trait BuildShell {
.update_half_edge(
cycle.half_edges().nth_circular(0),
|half_edge, core| {
[(half_edge, bad.face.surface())
[(
half_edge,
cycle
.half_edges()
.nth_circular(1)
.start_vertex(),
bad.face.surface(),
)
.reverse_curve_coordinate_systems(
core,
)]
@ -204,111 +211,154 @@ pub trait BuildShell {
core,
)
};
let dac =
{
let dac = Face::triangle([d, a, c], core);
dac.update_region(
|region, core| {
region.update_exterior(
|cycle, core| {
cycle
.update_half_edge(
cycle.half_edges().nth_circular(1),
|half_edge, core| {
[(half_edge, dac.face.surface())
.reverse_curve_coordinate_systems(core)]
},
core,
)
.join_to(
abc.face.region().exterior(),
1..=1,
2..=2,
dac.face.surface().clone(),
core,
)
.update_half_edge(
cycle.half_edges().nth_circular(0),
|half_edge, core| {
[(half_edge, dac.face.surface())
.reverse_curve_coordinate_systems(core)]
},
core,
)
.join_to(
bad.face.region().exterior(),
0..=0,
1..=1,
dac.face.surface().clone(),
core,
)
},
core,
)
},
core,
)
};
let cbd =
{
let cbd = Face::triangle([c, b, d], core);
cbd.update_region(
|region, core| {
region.update_exterior(
|cycle, core| {
cycle
.update_half_edge(
cycle.half_edges().nth_circular(0),
|half_edge, core| {
[(half_edge, cbd.face.surface())
.reverse_curve_coordinate_systems(core)]
},
core,
)
.update_half_edge(
cycle.half_edges().nth_circular(1),
|half_edge, core| {
[(half_edge, cbd.face.surface())
.reverse_curve_coordinate_systems(core)]
},
core,
)
.update_half_edge(
cycle.half_edges().nth_circular(2),
|half_edge, core| {
[(half_edge, cbd.face.surface())
.reverse_curve_coordinate_systems(core)]
},
core,
)
.join_to(
abc.face.region().exterior(),
0..=0,
1..=1,
cbd.face.surface().clone(),
core,
)
.join_to(
bad.face.region().exterior(),
1..=1,
2..=2,
cbd.face.surface().clone(),
core,
)
.join_to(
dac.face.region().exterior(),
2..=2,
2..=2,
cbd.face.surface().clone(),
core,
)
},
core,
)
},
core,
)
};
let dac = {
let dac = Face::triangle([d, a, c], core);
dac.update_region(
|region, core| {
region.update_exterior(
|cycle, core| {
cycle
.update_half_edge(
cycle.half_edges().nth_circular(1),
|half_edge, core| {
[(
half_edge,
cycle
.half_edges()
.nth_circular(2)
.start_vertex(),
dac.face.surface(),
)
.reverse_curve_coordinate_systems(
core,
)]
},
core,
)
.join_to(
abc.face.region().exterior(),
1..=1,
2..=2,
dac.face.surface().clone(),
core,
)
.update_half_edge(
cycle.half_edges().nth_circular(0),
|half_edge, core| {
[(
half_edge,
cycle
.half_edges()
.nth_circular(1)
.start_vertex(),
dac.face.surface(),
)
.reverse_curve_coordinate_systems(
core,
)]
},
core,
)
.join_to(
bad.face.region().exterior(),
0..=0,
1..=1,
dac.face.surface().clone(),
core,
)
},
core,
)
},
core,
)
};
let cbd = {
let cbd = Face::triangle([c, b, d], core);
cbd.update_region(
|region, core| {
region.update_exterior(
|cycle, core| {
cycle
.update_half_edge(
cycle.half_edges().nth_circular(0),
|half_edge, core| {
[(
half_edge,
cycle
.half_edges()
.nth_circular(1)
.start_vertex(),
cbd.face.surface(),
)
.reverse_curve_coordinate_systems(
core,
)]
},
core,
)
.update_half_edge(
cycle.half_edges().nth_circular(1),
|half_edge, core| {
[(
half_edge,
cycle
.half_edges()
.nth_circular(2)
.start_vertex(),
cbd.face.surface(),
)
.reverse_curve_coordinate_systems(
core,
)]
},
core,
)
.update_half_edge(
cycle.half_edges().nth_circular(2),
|half_edge, core| {
[(
half_edge,
cycle
.half_edges()
.nth_circular(3)
.start_vertex(),
cbd.face.surface(),
)
.reverse_curve_coordinate_systems(
core,
)]
},
core,
)
.join_to(
abc.face.region().exterior(),
0..=0,
1..=1,
cbd.face.surface().clone(),
core,
)
.join_to(
bad.face.region().exterior(),
1..=1,
2..=2,
cbd.face.surface().clone(),
core,
)
.join_to(
dac.face.region().exterior(),
2..=2,
2..=2,
cbd.face.surface().clone(),
core,
)
},
core,
)
},
core,
)
};
let triangles =
[abc, bad, dac, cbd].map(|triangle| triangle.insert(core));

View File

@ -1,20 +1,22 @@
use crate::{
operations::{derive::DeriveFrom, insert::Insert},
storage::Handle,
topology::{HalfEdge, Surface},
topology::{HalfEdge, Surface, Vertex},
Core,
};
use super::ReverseCurveCoordinateSystems;
impl ReverseCurveCoordinateSystems for (&Handle<HalfEdge>, &Handle<Surface>) {
impl ReverseCurveCoordinateSystems
for (&Handle<HalfEdge>, &Handle<Vertex>, &Handle<Surface>)
{
type Reversed = Handle<HalfEdge>;
fn reverse_curve_coordinate_systems(
self,
core: &mut Core,
) -> Self::Reversed {
let (half_edge, surface) = self;
let (half_edge, _end_vertex, surface) = self;
let mut half_edge_geom = *core.layers.geometry.of_half_edge(half_edge);
half_edge_geom.boundary = half_edge_geom.boundary.reverse();