use crate::{
objects::{HalfEdge, Shell},
storage::Handle,
};
use super::BoundingVerticesOfHalfEdge;
pub trait SiblingOfHalfEdge {
fn are_siblings(&self, a: &Handle<HalfEdge>, b: &Handle<HalfEdge>) -> bool;
fn get_sibling_of(
&self,
half_edge: &Handle<HalfEdge>,
) -> Option<Handle<HalfEdge>>;
}
impl SiblingOfHalfEdge for Shell {
fn are_siblings(&self, a: &Handle<HalfEdge>, b: &Handle<HalfEdge>) -> bool {
let same_curve = a.curve().id() == b.curve().id();
let same_boundary = a.boundary() == b.boundary().reverse();
let same_vertices = {
let Some(a_vertices) = self.bounding_vertices_of_half_edge(a)
else {
return false;
};
let Some(b_vertices) = self.bounding_vertices_of_half_edge(b)
else {
return false;
};
a_vertices == b_vertices.reverse()
};
same_curve && same_boundary && same_vertices
}
fn get_sibling_of(
&self,
half_edge: &Handle<HalfEdge>,
) -> Option<Handle<HalfEdge>> {
for face in self.faces() {
for cycle in face.region().all_cycles() {
for h in cycle.half_edges() {
if self.are_siblings(half_edge, h) {
return Some(h.clone());
}
}
}
}
None
}
}