use super::ray_cast::*;
use super::super::path::*;
use super::super::graph_path::*;
use super::super::super::super::geo::*;
pub struct PathCut<P: BezierPathFactory> {
pub interior_path: Vec<P>,
pub exterior_path: Vec<P>
}
pub fn path_cut<POut>(path1: &Vec<impl BezierPath<Point=POut::Point>>, path2: &Vec<impl BezierPath<Point=POut::Point>>, accuracy: f64) -> PathCut<POut>
where
POut: BezierPathFactory,
POut::Point: Coordinate+Coordinate2D,
{
if path1.is_empty() {
return PathCut {
interior_path: vec![],
exterior_path: vec![]
};
} else if path2.is_empty() {
return PathCut {
interior_path: vec![],
exterior_path: path1.iter().map(|path| POut::from_path(path)).collect()
};
}
let mut merged_path = GraphPath::new();
merged_path = merged_path.merge(GraphPath::from_merged_paths(path1.iter().map(|path| (path, PathLabel(0)))));
merged_path = merged_path.collide(GraphPath::from_merged_paths(path2.iter().map(|path| (path, PathLabel(1)))), accuracy);
merged_path.round(accuracy);
merged_path.set_exterior_by_intersecting();
merged_path.heal_exterior_gaps();
let interior_path = merged_path.exterior_paths();
merged_path.reset_edge_kinds();
merged_path.set_exterior_by_subtracting();
merged_path.heal_exterior_gaps();
let exterior_path = merged_path.exterior_paths();
PathCut {
interior_path,
exterior_path
}
}