{
- #[inline]
- pub fn to_centroid_net(&self, min_area: P::Scalar) -> Vec {
- #[inline]
- pub fn refine_with_circumcenters(mut self, min_area: P::Scalar) -> Self {
- self.refine_with_circumcenters_mut(min_area);
- self
- }
-
- #[inline]
- pub fn refine_with_circumcenters_by_obtuse_angle(mut self, min_area: P::Scalar) -> Self {
- self.refine_with_circumcenters_by_obtuse_angle_mut(min_area);
- self
- }
-
- #[inline]
- pub fn refine_with_circumcenters_mut(&mut self, min_area: P::Scalar) {
- let int_area = self.adapter.round_sqr_len_to_int(min_area);
- self.delaunay
- .refine_with_circumcenters_mut(int_area.to_uint());
- }
-
- #[inline]
- pub fn refine_with_circumcenters_by_obtuse_angle_mut(&mut self, min_area: P::Scalar) {
- let int_area = self.adapter.round_sqr_len_to_int(min_area);
- self.delaunay
- .refine_with_circumcenters_by_obtuse_angle_mut(int_area.to_uint());
- }
-}
diff --git a/iTriangle/src/float/convex.rs b/iTriangle/src/float/convex.rs
deleted file mode 100644
index 4fd3ac1..0000000
--- a/iTriangle/src/float/convex.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-use crate::float::delaunay::Delaunay;
-use alloc::vec::Vec;
-use i_overlay::i_float::float::compatible::FloatPointCompatible;
-use i_overlay::i_float::int::number::int::IntNumber;
-use i_overlay::i_shape::base::data::Contour;
-use i_overlay::i_shape::float::adapter::ShapeToFloat;
-
-impl {
- /// Groups triangles into non-overlapping convex polygons in counter-clockwise order.
- ///
- /// Returns a list of float-based [`Contour `]s.
- #[inline]
- pub fn to_convex_polygons(&self) -> Vec {
- self.custom_triangulate_as(validation)
- }
-
- /// Performs triangulation using the requested integer coordinate type.
- fn custom_triangulate_as(&self, validation: Validation) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey;
-
- /// Performs triangulation with Steiner points and a custom [`Validation`] config.
- fn custom_triangulate_with_steiner_points(
- &self,
- points: &[P],
- validation: Validation {
- self.custom_triangulate_with_steiner_points_as(points, validation)
- }
-
- /// Performs triangulation with Steiner points using the requested integer coordinate type.
- fn custom_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- validation: Validation,
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey;
-}
-
-impl CustomTriangulatable for Contour
-where
- P: FloatPointCompatible,
-{
- fn custom_triangulate_as(&self, validation: Validation) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_path(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).custom_triangulate(validation);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn custom_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- validation: Validation,
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_path(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .custom_triangulate_with_steiner_points(&float_points, validation);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
-
-impl CustomTriangulatable for [Contour ]
-where
- P: FloatPointCompatible,
-{
- fn custom_triangulate_as(&self, validation: Validation) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).custom_triangulate(validation);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn custom_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- validation: Validation,
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .custom_triangulate_with_steiner_points(&float_points, validation);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
-
-impl CustomTriangulatable for [Shape ]
-where
- P: FloatPointCompatible,
-{
- fn custom_triangulate_as(&self, validation: Validation) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_list_of_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).custom_triangulate(validation);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn custom_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- validation: Validation,
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_list_of_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .custom_triangulate_with_steiner_points(&float_points, validation);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
diff --git a/iTriangle/src/float/triangulatable.rs b/iTriangle/src/float/triangulatable.rs
deleted file mode 100644
index 32c057f..0000000
--- a/iTriangle/src/float/triangulatable.rs
+++ /dev/null
@@ -1,167 +0,0 @@
-use crate::float::triangulation::RawTriangulation;
-use crate::int::triangulatable::IntTriangulatable;
-use crate::int::triangulation::RawIntTriangulation;
-use i_key_sort::sort::key::SortKey;
-use i_overlay::i_float::adapter::FloatPointAdapter;
-use i_overlay::i_float::float::compatible::FloatPointCompatible;
-use i_overlay::i_float::float::rect::FloatRect;
-use i_overlay::i_float::int::number::int::IntNumber;
-use i_overlay::i_shape::base::data::{Contour, Shape};
-use i_overlay::i_shape::float::adapter::{PathToInt, ShapeToInt, ShapesToInt};
-use i_overlay::i_shape::float::rect::RectInit;
-use i_tree::{Expiration, LayoutNumber};
-
-/// A trait for triangulating float-based geometry with default validation.
-///
-/// Automatically converts the input to integer space, applies validation,
-/// and returns a float-mapped result.
-///
-/// # Implemented For
-/// - `Contour `
-/// - `[Contour ]`
-/// - `[Shape ]`
-pub trait Triangulatable {
- self.triangulate_as::
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey;
-
- /// Triangulates the shape(s) and inserts the given Steiner points.
- ///
- /// Points must lie strictly within the interior of the geometry.
- fn triangulate_with_steiner_points(&self, points: &[P]) -> RawTriangulation {
- self.triangulate_with_steiner_points_as::
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey;
-}
-
-impl Triangulatable for [P]
-where
- P: FloatPointCompatible,
-{
- fn triangulate_as(&self) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_path(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).triangulate();
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn triangulate_with_steiner_points_as(&self, points: &[P]) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_path(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .triangulate_with_steiner_points(&float_points);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
-
-impl Triangulatable for [Contour ]
-where
- P: FloatPointCompatible,
-{
- fn triangulate_as(&self) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).triangulate();
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn triangulate_with_steiner_points_as(&self, points: &[P]) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .triangulate_with_steiner_points(&float_points);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
-
-impl Triangulatable for [Shape ]
-where
- P: FloatPointCompatible,
-{
- fn triangulate_as(&self) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_list_of_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).triangulate();
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn triangulate_with_steiner_points_as(&self, points: &[P]) -> RawTriangulation
- where
- I: IntNumber + Expiration + LayoutNumber + SortKey,
- {
- if let Some(rect) = FloatRect::with_list_of_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .triangulate_with_steiner_points(&float_points);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
diff --git a/iTriangle/src/float/unchecked.rs b/iTriangle/src/float/unchecked.rs
deleted file mode 100644
index 4356aaa..0000000
--- a/iTriangle/src/float/unchecked.rs
+++ /dev/null
@@ -1,174 +0,0 @@
-use crate::float::triangulation::RawTriangulation;
-use crate::int::triangulation::RawIntTriangulation;
-use crate::int::unchecked::IntUncheckedTriangulatable;
-use i_key_sort::sort::key::SortKey;
-use i_overlay::i_float::adapter::FloatPointAdapter;
-use i_overlay::i_float::float::compatible::FloatPointCompatible;
-use i_overlay::i_float::float::rect::FloatRect;
-use i_overlay::i_float::int::number::int::IntNumber;
-use i_overlay::i_shape::base::data::{Contour, Shape};
-use i_overlay::i_shape::float::adapter::{PathToInt, ShapeToInt, ShapesToInt};
-use i_overlay::i_shape::float::rect::RectInit;
-use i_tree::Expiration;
-
-/// A trait for triangulating already valid float-based geometry.
-///
-/// Skips all validation for performance. Ideal when input is generated programmatically.
-///
-/// # Safety Requirements
-/// - Outer contours must be counter-clockwise
-/// - Holes must be clockwise
-/// - Steiner points must lie strictly within the shape
-pub trait UncheckedTriangulatable {
- self.unchecked_triangulate_as::
- where
- I: IntNumber + Expiration + SortKey;
-
- /// Same as `unchecked_triangulate`, but inserts user-defined Steiner points.
- fn unchecked_triangulate_with_steiner_points(&self, points: &[P]) -> RawTriangulation {
- self.unchecked_triangulate_with_steiner_points_as::
- where
- I: IntNumber + Expiration + SortKey;
-}
-
-impl UncheckedTriangulatable for [P]
-where
- P: FloatPointCompatible,
-{
- fn unchecked_triangulate_as(&self) -> RawTriangulation
- where
- I: IntNumber + Expiration + SortKey,
- {
- if let Some(rect) = FloatRect::with_path(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).uncheck_triangulate();
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn unchecked_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + SortKey,
- {
- if let Some(rect) = FloatRect::with_path(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .uncheck_triangulate_with_steiner_points(&float_points);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
-
-impl UncheckedTriangulatable for [Contour ]
-where
- P: FloatPointCompatible,
-{
- fn unchecked_triangulate_as(&self) -> RawTriangulation
- where
- I: IntNumber + Expiration + SortKey,
- {
- if let Some(rect) = FloatRect::with_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).uncheck_triangulate();
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn unchecked_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + SortKey,
- {
- if let Some(rect) = FloatRect::with_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .uncheck_triangulate_with_steiner_points(&float_points);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
-
-impl UncheckedTriangulatable for [Shape ]
-where
- P: FloatPointCompatible,
-{
- fn unchecked_triangulate_as(&self) -> RawTriangulation
- where
- I: IntNumber + Expiration + SortKey,
- {
- if let Some(rect) = FloatRect::with_list_of_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let raw = self.to_int(&adapter).uncheck_triangulate();
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-
- fn unchecked_triangulate_with_steiner_points_as(
- &self,
- points: &[P],
- ) -> RawTriangulation
- where
- I: IntNumber + Expiration + SortKey,
- {
- if let Some(rect) = FloatRect::with_list_of_paths(self) {
- let adapter = FloatPointAdapter:: ::new(rect);
- let float_points = points.to_int(&adapter);
- let raw = self
- .to_int(&adapter)
- .uncheck_triangulate_with_steiner_points(&float_points);
- RawTriangulation { raw, adapter }
- } else {
- RawTriangulation {
- raw: RawIntTriangulation::default(),
- adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
- }
- }
- }
-}
diff --git a/iTriangle/src/generic/adapter.rs b/iTriangle/src/generic/adapter.rs
new file mode 100644
index 0000000..4f7db5c
--- /dev/null
+++ b/iTriangle/src/generic/adapter.rs
@@ -0,0 +1,88 @@
+use alloc::vec::Vec;
+use core::marker::PhantomData;
+use i_overlay::i_float::adapter::FloatPointAdapter;
+use i_overlay::i_float::float::compatible::FloatPointCompatible;
+use i_overlay::i_float::int::number::int::IntNumber;
+use i_overlay::i_float::int::number::wide_int::WideIntNumber;
+use i_overlay::i_float::int::point::IntPoint;
+
+pub trait PointAdapter: Clone {
+ type Point: Clone;
+ type Int: IntNumber;
+ type Measure: Copy;
+
+ fn to_int_point(&self, point: &Self::Point) -> IntPoint PointAdapter for FloatPointAdapter
+where
+ P: FloatPointCompatible,
+ I: IntNumber,
+{
+ type Point = P;
+ type Int = I;
+ type Measure = P::Scalar;
+
+ #[inline]
+ fn to_int_point(&self, point: &P) -> IntPoint {
+ self.float_to_int(point)
+ }
+
+ #[inline]
+ fn from_int_point(&self, point: &IntPoint) -> P {
+ self.int_to_float(point)
+ }
+
+ #[inline]
+ fn measure_to_int_area(&self, measure: P::Scalar) -> I::WideUInt {
+ self.round_sqr_len_to_int(measure).to_uint()
+ }
+}
diff --git a/iTriangle/src/float/builder.rs b/iTriangle/src/generic/builder.rs
similarity index 96%
rename from iTriangle/src/float/builder.rs
rename to iTriangle/src/generic/builder.rs
index 68814f3..54491a3 100644
--- a/iTriangle/src/float/builder.rs
+++ b/iTriangle/src/generic/builder.rs
@@ -1,4 +1,4 @@
-use crate::float::triangulation::Triangulation;
+use crate::generic::triangulation::Triangulation;
use crate::int::triangulation::IndexType;
use alloc::vec::Vec;
diff --git a/iTriangle/src/generic/centroid_net.rs b/iTriangle/src/generic/centroid_net.rs
new file mode 100644
index 0000000..d911bab
--- /dev/null
+++ b/iTriangle/src/generic/centroid_net.rs
@@ -0,0 +1,16 @@
+use crate::generic::adapter::PointAdapter;
+use crate::generic::delaunay::Delaunay;
+use alloc::vec::Vec;
+use i_overlay::i_shape::base::data::Contour;
+
+impl {
+ type Adapter: PointAdapter {
+ /// Performs triangulation using the requested integer coordinate type.
+ fn custom_triangulate_as(
+ &self,
+ validation: Validation,
+ ) -> RawTriangulation CustomTriangulatable for [P]
+where
+ P: FloatPointCompatible,
+{
+ type Adapter = FloatPointAdapter ;
+
+ #[inline]
+ fn custom_triangulate(&self, validation: Validation CustomTriangulatableAs for [P]
+where
+ P: FloatPointCompatible,
+{
+ fn custom_triangulate_as(
+ &self,
+ validation: Validation,
+ ) -> RawTriangulation ::new(rect);
+ let int_contour: IntContour = adapter.points_to_int(self);
+ let raw = IntCustomTriangulatable::custom_triangulate(&int_contour, validation);
+ RawTriangulation { raw, adapter }
+ } else {
+ RawTriangulation {
+ raw: RawIntTriangulation::default(),
+ adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
+ }
+ }
+ }
+
+ fn custom_triangulate_with_steiner_points_as(
+ &self,
+ points: &[P],
+ validation: Validation,
+ ) -> RawTriangulation ::new(rect);
+ let int_points = adapter.points_to_int(points);
+ let int_contour: IntContour = adapter.points_to_int(self);
+ let raw = IntCustomTriangulatable::custom_triangulate_with_steiner_points(
+ &int_contour,
+ &int_points,
+ validation,
+ );
+ RawTriangulation { raw, adapter }
+ } else {
+ RawTriangulation {
+ raw: RawIntTriangulation::default(),
+ adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
+ }
+ }
+ }
+}
+
+impl CustomTriangulatable for [Contour ]
+where
+ P: FloatPointCompatible,
+{
+ type Adapter = FloatPointAdapter ;
+
+ #[inline]
+ fn custom_triangulate(&self, validation: Validation CustomTriangulatableAs for [Contour ]
+where
+ P: FloatPointCompatible,
+{
+ fn custom_triangulate_as(
+ &self,
+ validation: Validation,
+ ) -> RawTriangulation ::new(rect);
+ let int_shape: IntShape = self.iter().map(|c| adapter.points_to_int(c)).collect();
+ let raw = IntCustomTriangulatable::custom_triangulate(&int_shape, validation);
+ RawTriangulation { raw, adapter }
+ } else {
+ RawTriangulation {
+ raw: RawIntTriangulation::default(),
+ adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
+ }
+ }
+ }
+
+ fn custom_triangulate_with_steiner_points_as(
+ &self,
+ points: &[P],
+ validation: Validation,
+ ) -> RawTriangulation ::new(rect);
+ let int_points = adapter.points_to_int(points);
+ let int_shape: IntShape = self.iter().map(|c| adapter.points_to_int(c)).collect();
+ let raw = IntCustomTriangulatable::custom_triangulate_with_steiner_points(
+ &int_shape,
+ &int_points,
+ validation,
+ );
+ RawTriangulation { raw, adapter }
+ } else {
+ RawTriangulation {
+ raw: RawIntTriangulation::default(),
+ adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
+ }
+ }
+ }
+}
+
+impl CustomTriangulatable for [Shape ]
+where
+ P: FloatPointCompatible,
+{
+ type Adapter = FloatPointAdapter ;
+
+ #[inline]
+ fn custom_triangulate(&self, validation: Validation CustomTriangulatableAs for [Shape ]
+where
+ P: FloatPointCompatible,
+{
+ fn custom_triangulate_as(
+ &self,
+ validation: Validation,
+ ) -> RawTriangulation ::new(rect);
+ let int_shapes: IntShapes = self
+ .iter()
+ .map(|shape| shape.iter().map(|c| adapter.points_to_int(c)).collect())
+ .collect();
+ let raw = IntCustomTriangulatable::custom_triangulate(&int_shapes, validation);
+ RawTriangulation { raw, adapter }
+ } else {
+ RawTriangulation {
+ raw: RawIntTriangulation::default(),
+ adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
+ }
+ }
+ }
+
+ fn custom_triangulate_with_steiner_points_as(
+ &self,
+ points: &[P],
+ validation: Validation,
+ ) -> RawTriangulation ::new(rect);
+ let int_points = adapter.points_to_int(points);
+ let int_shapes: IntShapes = self
+ .iter()
+ .map(|shape| shape.iter().map(|c| adapter.points_to_int(c)).collect())
+ .collect();
+ let raw = IntCustomTriangulatable::custom_triangulate_with_steiner_points(
+ &int_shapes,
+ &int_points,
+ validation,
+ );
+ RawTriangulation { raw, adapter }
+ } else {
+ RawTriangulation {
+ raw: RawIntTriangulation::default(),
+ adapter: FloatPointAdapter:: ::new(FloatRect::zero()),
+ }
+ }
+ }
+}
+
+impl CustomTriangulatable ,
+pub struct Delaunay {
+impl {
+ pub fn into_delaunay(self) -> Delaunay {
let mut buffer = DelaunayBuffer::new();
self.into_delaunay_with_buffer(&mut buffer)
}
#[inline]
- pub fn into_delaunay_with_buffer(self, buffer: &mut DelaunayBuffer) -> Delaunay {
+ pub fn into_delaunay_with_buffer(self, buffer: &mut DelaunayBuffer) -> Delaunay {
Delaunay {
delaunay: self.raw.into_delaunay_with_buffer(buffer),
adapter: self.adapter,
@@ -33,11 +30,11 @@ impl