simple-geom 0.1.1

Rust Library with simple plane geometry
Documentation
use super::*;
use float_cmp::approx_eq;

fn poly_points(p: &Polygon2D) -> Vec<f64> {
    p.points().flat_map(|pt| [pt.x(), pt.y()]).collect::<Vec<_>>()
}

#[test]
fn point_ctor() {
    let p = Point2D::new(1., 1.);
    assert_eq!(p.x(), 1.);
    assert_eq!(p.y(), 1.);
}

#[test]
fn polygon_01() {
    let mut p = Polygon2D::with_points(&[Point2D::new(0., 0.), Point2D::new(1., 0.), Point2D::new(1., 1.), Point2D::new(0., 1.)]);
    let res = p.intersect_with_semiplane_mut(&Line2D::with_points(&Point2D::new(0., 0.5), &Point2D::new(0.5, 0.5)), true);
    assert!(res);
    assert!(approx_eq!(&[f64],
        &poly_points(&p),
        &[1., 0.5, 1., 1., 0., 1., 0., 0.5],
        epsilon = 1e-5
    ));
}

#[test]
fn polygon_02() {
    let mut p = Polygon2D::with_points(&[Point2D::new(-300., -300.), Point2D::new(300., -300.), Point2D::new(300., 300.), Point2D::new(-300., 300.)]);
    let mut res;
    let e = Vector2D::new(1., 0.);
    res = p.intersect_with_semiplane_mut(&Line2D::new(e, -10.), true);
    assert!(res);
    assert!(approx_eq!(&[f64],
        &poly_points(&p),
        &[-10., -300., 300., -300., 300., 300., -10., 300.],
        epsilon = 1e-5
    ));
    
    res = p.intersect_with_semiplane_mut(&Line2D::new(e, 70.), false);
    assert!(res);
    assert!(approx_eq!(&[f64],
        &poly_points(&p),
        &[-10., -300., 70., -300., 70., 300., -10., 300.],
        epsilon = 1e-5
    ));
}

#[test]
fn normalize_zero() {
    let v = Point2D::origin().to_vec();
    let u = v.unit();
    assert!(u.map_or(true, |u| approx_eq!(f64, 1.0, u.len())));
}