use super::ray_cast::*;
use super::super::path::*;
use super::super::graph_path::*;
use super::super::super::super::geo::*;
#[derive(Clone, Debug)]
pub struct PathIntersection<P: BezierPathFactory> {
pub intersecting_path: Vec<P>,
pub exterior_paths: [Vec<P>; 2]
}
pub fn path_full_intersect<POut>(path1: &Vec<impl BezierPath<Point=POut::Point>>, path2: &Vec<impl BezierPath<Point=POut::Point>>, accuracy: f64) -> PathIntersection<POut>
where
POut: BezierPathFactory,
POut::Point: Coordinate+Coordinate2D
{
if path1.is_empty() {
return PathIntersection {
intersecting_path: vec![],
exterior_paths: [vec![], path2.iter().map(|path| POut::from_path(path)).collect()]
};
} else if path2.is_empty() {
return PathIntersection {
intersecting_path: vec![],
exterior_paths: [path1.iter().map(|path| POut::from_path(path)).collect(), vec![]]
};
}
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 intersecting_path = merged_path.exterior_paths();
merged_path.reset_edge_kinds();
merged_path.set_exterior_by_subtracting();
merged_path.heal_exterior_gaps();
let exterior_from_path_1 = merged_path.exterior_paths();
let mut merged_path = GraphPath::new();
merged_path = merged_path.merge(GraphPath::from_merged_paths(path2.iter().map(|path| (path, PathLabel(0)))));
merged_path = merged_path.collide(GraphPath::from_merged_paths(path1.iter().map(|path| (path, PathLabel(1)))), accuracy);
merged_path.round(accuracy);
merged_path.set_exterior_by_subtracting();
merged_path.heal_exterior_gaps();
let exterior_from_path_2 = merged_path.exterior_paths();
PathIntersection {
intersecting_path: intersecting_path,
exterior_paths: [exterior_from_path_1, exterior_from_path_2]
}
}