use crate::core::fill_rule::FillRule;
use crate::core::overlay_rule::OverlayRule;
use crate::core::solver::Solver;
use crate::float::overlay::{FloatOverlay, OverlayOptions};
use i_float::float::compatible::FloatPointCompatible;
use i_shape::base::data::Shapes;
use i_shape::source::resource::ShapeResource;
pub trait SimplifyShape<P: FloatPointCompatible> {
fn simplify_shape(&self, fill_rule: FillRule) -> Shapes<P>;
fn simplify_shape_custom(
&self,
fill_rule: FillRule,
options: OverlayOptions<P::Scalar>,
solver: Solver,
) -> Shapes<P>;
}
impl<S, P> SimplifyShape<P> for S
where
S: ShapeResource<P>,
P: FloatPointCompatible,
{
#[inline]
fn simplify_shape(&self, fill_rule: FillRule) -> Shapes<P> {
FloatOverlay::with_subj_custom(self, Default::default(), Default::default())
.overlay(OverlayRule::Subject, fill_rule)
}
#[inline]
fn simplify_shape_custom(
&self,
fill_rule: FillRule,
options: OverlayOptions<P::Scalar>,
solver: Solver,
) -> Shapes<P> {
FloatOverlay::with_subj_custom(self, options, solver).overlay(OverlayRule::Subject, fill_rule)
}
}
#[cfg(test)]
mod tests {
use crate::core::fill_rule::FillRule;
use crate::float::simplify::SimplifyShape;
use alloc::vec;
#[test]
fn test_contour_slice() {
let rect = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0]];
let shapes = rect.as_slice().simplify_shape(FillRule::NonZero);
assert_eq!(shapes.len(), 1);
assert_eq!(shapes[0].len(), 1);
assert_eq!(shapes[0][0].len(), 4);
}
#[test]
fn test_contour_vec() {
let rect = vec![[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [1.0, 1.0], [1.0, 0.0]];
let shapes = rect.simplify_shape(FillRule::NonZero);
assert_eq!(shapes.len(), 1);
assert_eq!(shapes[0].len(), 1);
assert_eq!(shapes[0][0].len(), 4);
}
}