use crate::core::extract::BooleanExtractionBuffer;
use crate::core::graph::OverlayGraph;
use crate::core::overlay_rule::OverlayRule;
use i_float::adapter::FloatPointAdapter;
use i_float::float::compatible::FloatPointCompatible;
use i_shape::base::data::Shapes;
use i_shape::float::adapter::ShapesToFloat;
use i_shape::float::despike::DeSpikeContour;
use i_shape::float::simple::SimplifyContour;
pub struct FloatOverlayGraph<'a, P: FloatPointCompatible> {
pub graph: OverlayGraph<'a>,
pub adapter: FloatPointAdapter<P>,
clean_result: bool,
}
impl<'a, P: FloatPointCompatible> FloatOverlayGraph<'a, P> {
#[inline]
pub(crate) fn new(graph: OverlayGraph<'a>, adapter: FloatPointAdapter<P>, clean_result: bool) -> Self {
Self {
graph,
adapter,
clean_result,
}
}
#[inline]
pub fn extract_shapes(
&self,
overlay_rule: OverlayRule,
buffer: &mut BooleanExtractionBuffer,
) -> Shapes<P> {
let shapes = self.graph.extract_shapes(overlay_rule, buffer);
let mut float = shapes.to_float(&self.adapter);
if self.clean_result {
if self.graph.options.preserve_output_collinear {
float.despike_contour(&self.adapter);
} else {
float.simplify_contour(&self.adapter);
}
}
float
}
}