use-math 0.0.6

Utility-first facade crate for RustUse math utilities
Documentation
use use_math::{geometry, prelude::*};

fn approx_eq(left: f64, right: f64) -> bool {
    (left - right).abs() < 1.0e-10
}

#[test]
fn facade_prelude_exposes_validated_geometry_workflow() -> Result<(), geometry::GeometryError> {
    let a = Point2::try_new(0.0, 0.0)?;
    let b = Point2::try_new(4.0, 0.0)?;
    let c = Point2::try_new(0.0, 3.0)?;

    let triangle = Triangle::try_new(a, b, c)?;
    let bounds = Aabb2::from_points(a, c);

    assert!(approx_eq(distance_2d(a, b), 4.0));
    assert!(approx_eq(midpoint_2d(a, c).y(), 1.5));
    assert_eq!(try_orientation_2d(a, b, c)?, Orientation2::CounterClockwise);
    assert_eq!(
        orientation_2d_with_tolerance(a, b, c, 0.0)?,
        Orientation2::CounterClockwise
    );
    assert!(approx_eq(triangle.perimeter(), 12.0));
    assert!(bounds.contains_point(Point2::new(0.0, 1.5)));

    Ok(())
}

#[test]
fn facade_root_reexports_geometry_workflow() -> Result<(), use_math::GeometryError> {
    let a = use_math::Point2::try_new(0.0, 0.0)?;
    let b = use_math::Point2::try_new(4.0, 0.0)?;
    let c = use_math::Point2::try_new(0.0, 3.0)?;

    let triangle = use_math::Triangle::try_new(a, b, c)?;
    let bounds = use_math::Aabb2::from_points(a, c);

    assert!(approx_eq(use_math::distance_2d(a, b), 4.0));
    assert!(approx_eq(use_math::midpoint_2d(a, c).y(), 1.5));
    assert_eq!(
        use_math::try_orientation_2d(a, b, c)?,
        use_math::Orientation2::CounterClockwise
    );
    assert_eq!(
        use_math::orientation_2d_with_tolerance(a, b, c, 0.0)?,
        use_math::Orientation2::CounterClockwise
    );
    assert!(approx_eq(triangle.perimeter(), 12.0));
    assert!(bounds.contains_point(use_math::Point2::new(0.0, 1.5)));

    Ok(())
}

#[test]
fn facade_reexports_geometry_errors() {
    assert!(matches!(
        geometry::Point2::try_new(0.0, f64::NEG_INFINITY),
        Err(geometry::GeometryError::NonFiniteComponent {
            type_name: "Point2",
            component: "y",
            value: f64::NEG_INFINITY,
        })
    ));
}