mod mono_poly;
use crate::{Coord, GeoNum, Intersects, MultiPolygon, Polygon};
pub use mono_poly::MonoPoly;
mod segment;
use segment::RcSegment;
pub(crate) use segment::Segment;
mod sweep;
pub(crate) use sweep::SimpleSweep;
mod builder;
pub use builder::monotone_subdivision;
#[derive(Clone, Debug)]
pub struct MonotonicPolygons<T: GeoNum>(Vec<MonoPoly<T>>);
impl<T: GeoNum> MonotonicPolygons<T> {
pub fn subdivisions(&self) -> &Vec<MonoPoly<T>> {
&self.0
}
pub fn into_subdivisions(self) -> Vec<MonoPoly<T>> {
self.0
}
}
impl<T: GeoNum> From<Polygon<T>> for MonotonicPolygons<T> {
fn from(poly: Polygon<T>) -> Self {
Self(monotone_subdivision([poly]))
}
}
impl<T: GeoNum> From<MultiPolygon<T>> for MonotonicPolygons<T> {
fn from(mp: MultiPolygon<T>) -> Self {
Self(monotone_subdivision(mp.0))
}
}
impl<T: GeoNum> Intersects<Coord<T>> for MonotonicPolygons<T> {
fn intersects(&self, other: &Coord<T>) -> bool {
self.0.iter().any(|mp| mp.intersects(other))
}
}
#[cfg(test)]
mod tests;