From c1f57303ed1bcdc3d1dc52dbdb716ce46437b4cb Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 9 Jul 2024 20:55:09 +0200 Subject: [PATCH 1/2] Prepare for follow-on change --- .../fj-core/src/operations/split/half_edge.rs | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/crates/fj-core/src/operations/split/half_edge.rs b/crates/fj-core/src/operations/split/half_edge.rs index 4e0a3c0e9..74cbe4a05 100644 --- a/crates/fj-core/src/operations/split/half_edge.rs +++ b/crates/fj-core/src/operations/split/half_edge.rs @@ -41,26 +41,32 @@ impl SplitHalfEdge for Handle { point: impl Into>, core: &mut Core, ) -> [Handle; 2] { + let half_edge = self; let point = point.into(); - let geometry = *core.layers.geometry.of_half_edge(self); + let geometry = *core.layers.geometry.of_half_edge(half_edge); let [start, end] = geometry.boundary.inner; - let a = - HalfEdge::new(self.curve().clone(), self.start_vertex().clone()) - .insert(core) - .derive_from(self, core) - .set_geometry( - geometry.with_boundary([start, point]), - &mut core.layers.geometry, - ); - let b = HalfEdge::new(self.curve().clone(), Vertex::new().insert(core)) - .insert(core) - .derive_from(self, core) - .set_geometry( - geometry.with_boundary([point, end]), - &mut core.layers.geometry, - ); + let a = HalfEdge::new( + half_edge.curve().clone(), + half_edge.start_vertex().clone(), + ) + .insert(core) + .derive_from(half_edge, core) + .set_geometry( + geometry.with_boundary([start, point]), + &mut core.layers.geometry, + ); + let b = HalfEdge::new( + half_edge.curve().clone(), + Vertex::new().insert(core), + ) + .insert(core) + .derive_from(half_edge, core) + .set_geometry( + geometry.with_boundary([point, end]), + &mut core.layers.geometry, + ); core.layers.geometry.define_vertex( b.start_vertex().clone(), From 5110eebede2073db01b442eac32d1ceb663b72e5 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 9 Jul 2024 20:56:31 +0200 Subject: [PATCH 2/2] Implement `SplitHalfEdge` for `Cycle` This provides more flexibility, specifically regarding the ongoing changes to the geometry representation. --- crates/fj-core/src/operations/split/edge.rs | 9 ++++++--- crates/fj-core/src/operations/split/half_edge.rs | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/fj-core/src/operations/split/edge.rs b/crates/fj-core/src/operations/split/edge.rs index bd669e921..8afe3cbd5 100644 --- a/crates/fj-core/src/operations/split/edge.rs +++ b/crates/fj-core/src/operations/split/edge.rs @@ -5,7 +5,7 @@ use crate::{ geometry::UpdateHalfEdgeGeometry, insert::Insert, replace::ReplaceHalfEdge, split::SplitHalfEdge, update::UpdateHalfEdge, }, - queries::SiblingOfHalfEdge, + queries::{CycleOfHalfEdge, SiblingOfHalfEdge}, storage::Handle, topology::{HalfEdge, Shell}, Core, @@ -40,11 +40,14 @@ impl SplitEdge for Shell { .get_sibling_of(half_edge) .expect("Expected half-edge and its sibling to be part of shell"); - let [half_edge_a, half_edge_b] = half_edge.split_half_edge(point, core); + let [half_edge_a, half_edge_b] = self + .find_cycle_of_half_edge(half_edge) + .expect("Expected half-edge to be part of shell") + .split_half_edge(half_edge, point, core); let siblings = { let [sibling_a, sibling_b] = - sibling.sibling.split_half_edge(point, core); + sibling.cycle.split_half_edge(&sibling.sibling, point, core); let sibling_b = sibling_b .update_start_vertex( |_, _| half_edge_b.start_vertex().clone(), diff --git a/crates/fj-core/src/operations/split/half_edge.rs b/crates/fj-core/src/operations/split/half_edge.rs index 74cbe4a05..3e304e933 100644 --- a/crates/fj-core/src/operations/split/half_edge.rs +++ b/crates/fj-core/src/operations/split/half_edge.rs @@ -6,7 +6,7 @@ use crate::{ derive::DeriveFrom, geometry::UpdateHalfEdgeGeometry, insert::Insert, }, storage::Handle, - topology::{HalfEdge, Vertex}, + topology::{Cycle, HalfEdge, Vertex}, Core, }; @@ -30,18 +30,19 @@ pub trait SplitHalfEdge { #[must_use] fn split_half_edge( &self, + half_edge: &Handle, point: impl Into>, core: &mut Core, ) -> [Handle; 2]; } -impl SplitHalfEdge for Handle { +impl SplitHalfEdge for Cycle { fn split_half_edge( &self, + half_edge: &Handle, point: impl Into>, core: &mut Core, ) -> [Handle; 2] { - let half_edge = self; let point = point.into(); let geometry = *core.layers.geometry.of_half_edge(half_edge);