pub fn is_valid_ring<R, P>(ring: &R) -> Result<(), ValidityFailure>where
R: RingTrait<Point = P>,
P: PointMut + Default + Copy,
P::Scalar: CoordinateScalar + Into<f64>,
<P::Cs as CoordinateSystem>::Family: SameAs<CartesianFamily>,Expand description
Validate a single ring.
Checks point count, closure, coordinate finiteness, that no two
non-adjacent edges intersect, that no vertex triple is a spike, and
that the ring is wound in its declared order. Returns Ok(()) for a
valid ring.
Mirrors the ring arm of boost::geometry::is_valid
(algorithms/is_valid.hpp, via detail/is_valid/ring.hpp).
§Errors
Returns a ValidityFailure describing the first rule the ring violates,
including ValidityFailure::Spikes and
ValidityFailure::WrongOrientation.
§Examples
use geometry_cs::Cartesian;
use geometry_model::{Point2D, Ring};
use geometry_overlay::validity::is_valid_ring;
type P = Point2D<f64, Cartesian>;
let square: Ring<P> = Ring::from_vec(vec![
P::new(0.0, 0.0), P::new(0.0, 1.0), P::new(1.0, 1.0), P::new(1.0, 0.0), P::new(0.0, 0.0),
]);
assert!(is_valid_ring(&square).is_ok());