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));