spade

Function mitigate_underflow

Source
pub fn mitigate_underflow(position: Point2<f64>) -> Point2<f64>
Expand description

Prevents underflow issues of a position by setting any coordinate that is too small to zero.

A vertex inserted with a position returned by this function will never cause InsertionError::TooSmall when being inserted into a triangulation or. Note that this method will always round towards zero, even if rounding to ±MIN_ALLOWED_VALUE would result in a smaller rounding error.

This function might be useful if the vertices come from an uncontrollable source like user input. Spade does not offer a mitigate_overflow method as clamping a coordinate to ±MIN_ALLOWED_VALUE could result in an arbitrarily large error.

§Example

use spade::{DelaunayTriangulation, InsertionError, Triangulation, Point2};

let mut triangulation = DelaunayTriangulation::<_>::default();

let invalid_position = Point2::new(1.0e-44, 42.0);
// Oh no! We're not allowed to insert that point!
assert_eq!(
    triangulation.insert(invalid_position),
    Err(InsertionError::TooSmall)
);

let valid_position = spade::mitigate_underflow(invalid_position);

// That's better!
assert!(triangulation.insert(valid_position).is_ok());

// But keep in mind that the position has changed:
assert_ne!(invalid_position, valid_position);
assert_eq!(valid_position, Point2::new(0.0, 42.0));