fj_core/operations/split/
half_edge.rs1use fj_math::Point;
2
3use crate::{
4 geometry::HalfEdgeGeometry,
5 objects::{HalfEdge, Vertex},
6 operations::insert::Insert,
7 storage::Handle,
8 Core,
9};
10
11pub trait SplitHalfEdge {
18 #[must_use]
29 fn split_half_edge(
30 &self,
31 point: impl Into<Point<1>>,
32 core: &mut Core,
33 ) -> [Handle<HalfEdge>; 2];
34}
35
36impl SplitHalfEdge for Handle<HalfEdge> {
37 fn split_half_edge(
38 &self,
39 point: impl Into<Point<1>>,
40 core: &mut Core,
41 ) -> [Handle<HalfEdge>; 2] {
42 let point = point.into();
43
44 let [start, end] = self.boundary().inner;
45
46 let a = HalfEdge::new(
47 core.layers.geometry.of_half_edge(self).path,
48 [start, point],
49 self.curve().clone(),
50 self.start_vertex().clone(),
51 )
52 .insert(core);
53 let b = HalfEdge::new(
54 core.layers.geometry.of_half_edge(self).path,
55 [point, end],
56 self.curve().clone(),
57 Vertex::new().insert(core),
58 )
59 .insert(core);
60
61 core.layers.geometry.define_half_edge(
62 a.clone(),
63 HalfEdgeGeometry {
64 path: core.layers.geometry.of_half_edge(self).path,
65 },
66 );
67 core.layers.geometry.define_half_edge(
68 b.clone(),
69 HalfEdgeGeometry {
70 path: core.layers.geometry.of_half_edge(self).path,
71 },
72 );
73
74 [a, b]
75 }
76}