use fj_math::Point;
use crate::{
geometry::HalfEdgeGeometry,
objects::{HalfEdge, Vertex},
operations::insert::Insert,
storage::Handle,
Core,
};
pub trait SplitHalfEdge {
#[must_use]
fn split_half_edge(
&self,
point: impl Into<Point<1>>,
core: &mut Core,
) -> [Handle<HalfEdge>; 2];
}
impl SplitHalfEdge for Handle<HalfEdge> {
fn split_half_edge(
&self,
point: impl Into<Point<1>>,
core: &mut Core,
) -> [Handle<HalfEdge>; 2] {
let point = point.into();
let [start, end] = self.boundary().inner;
let a = HalfEdge::new(
core.layers.geometry.of_half_edge(self).path,
[start, point],
self.curve().clone(),
self.start_vertex().clone(),
)
.insert(core);
let b = HalfEdge::new(
core.layers.geometry.of_half_edge(self).path,
[point, end],
self.curve().clone(),
Vertex::new().insert(core),
)
.insert(core);
core.layers.geometry.define_half_edge(
a.clone(),
HalfEdgeGeometry {
path: core.layers.geometry.of_half_edge(self).path,
},
);
core.layers.geometry.define_half_edge(
b.clone(),
HalfEdgeGeometry {
path: core.layers.geometry.of_half_edge(self).path,
},
);
[a, b]
}
}