use honeycomb_core::cmap::{CMap2, DartIdType};
use honeycomb_core::geometry::CoordsFloat;
use crate::grisubal::model::{Geometry2, GeometryVertex, MapEdge};
use super::Segments;
pub(crate) fn generate_edge_data<T: CoordsFloat>(
cmap: &CMap2<T>,
geometry: &Geometry2<T>,
new_segments: &Segments,
intersection_darts: &[DartIdType],
) -> Vec<MapEdge<T>> {
new_segments
.iter()
.filter(|(k, _)| {
matches!(
k,
GeometryVertex::Intersec(_) | GeometryVertex::IntersecCorner(..)
)
})
.map(|(start, v)| {
let mut end = v;
let mut intermediates = Vec::new();
while !matches!(
end,
GeometryVertex::Intersec(_) | GeometryVertex::IntersecCorner(_)
) {
match end {
GeometryVertex::PoI(vid) => {
intermediates.push(geometry.vertices[*vid]);
end = &new_segments[end];
}
GeometryVertex::Regular(_) => {
end = &new_segments[end];
}
GeometryVertex::Intersec(_) | GeometryVertex::IntersecCorner(..) => {
unreachable!() }
}
}
let d_start = match start {
GeometryVertex::Intersec(d_start_idx) => {
cmap.beta::<2>(intersection_darts[*d_start_idx])
}
GeometryVertex::IntersecCorner(d_in) => {
cmap.beta::<2>(cmap.beta::<1>(cmap.beta::<2>(*d_in)))
}
_ => unreachable!(), };
let d_end = match end {
GeometryVertex::Intersec(d_end_idx) => intersection_darts[*d_end_idx],
GeometryVertex::IntersecCorner(d_in) => *d_in,
_ => unreachable!(), };
MapEdge {
start: d_start,
intermediates,
end: d_end,
}
})
.collect()
}