parry2d 0.28.0

2 dimensional collision detection library in Rust.
Documentation
use parry2d::math::Vector;
use parry2d::{query::PointQuery, shape::TriMesh};

#[test]
fn project_local_point_and_get_feature_gets_the_enclosing_triangle() {
    let vertices = vec![
        Vector::new(0.0, 1.0),
        Vector::ZERO,
        Vector::new(1.0, 0.0),
        Vector::new(1.0, 1.0),
    ];

    let mesh = TriMesh::new(vertices, vec![[0, 1, 2], [3, 0, 2]]).unwrap();
    let query_pt = Vector::new(0.6, 0.6); // Inside the top-right triangle (index 1)

    let (proj, feat) = mesh.project_local_point_and_get_feature(query_pt);

    let correct_tri_idx = 1;
    let correct_tri = mesh.triangle(correct_tri_idx);

    let is_inside_correct = correct_tri.contains_local_point(query_pt);

    assert!(is_inside_correct);
    assert_eq!(proj.is_inside, is_inside_correct);
    assert_eq!(feat.unwrap_face(), correct_tri_idx);
}

#[test]
fn project_local_point_and_get_feature_projects_correctly_from_outside() {
    let vertices = vec![
        Vector::new(0.0, 1.0),
        Vector::ZERO,
        Vector::new(1.0, 0.0),
        Vector::new(1.0, 1.0),
    ];

    let mesh = TriMesh::new(vertices, vec![[0, 1, 2], [3, 0, 2]]).unwrap();

    {
        let query_pt = Vector::new(-1.0, 0.0); // Left from the bottom-left triangle (index 0)

        let (proj, feat) = mesh.project_local_point_and_get_feature(query_pt);

        let correct_tri_idx = 0;
        let correct_tri = mesh.triangle(correct_tri_idx);

        let is_inside_correct = correct_tri.contains_local_point(query_pt);

        assert_eq!(is_inside_correct, false);
        assert_eq!(proj.is_inside, is_inside_correct);
        assert_eq!(proj.point, Vector::ZERO);
        assert_eq!(feat.unwrap_face(), correct_tri_idx);
    }
    {
        let query_pt = Vector::new(0.5, 2.0); // Above the top-right triangle (index 1)

        let (proj, feat) = mesh.project_local_point_and_get_feature(query_pt);

        let correct_tri_idx = 1;
        let correct_tri = mesh.triangle(correct_tri_idx);

        let is_inside_correct = correct_tri.contains_local_point(query_pt);

        assert_eq!(is_inside_correct, false);
        assert_eq!(proj.is_inside, is_inside_correct);
        assert_eq!(proj.point, Vector::new(0.5, 1.0));
        assert_eq!(feat.unwrap_face(), correct_tri_idx);
    }
}