conspire 0.7.1

The Rust interface to conspire.
Documentation
use crate::geometry::{
    Coordinates,
    mesh::{Connectivity, Mesh},
};

fn mesh(connectivity: Vec<[usize; 3]>, points: Vec<[f64; 3]>) -> Mesh<3> {
    Mesh::from((
        vec![Connectivity::Triangular(connectivity.into())],
        Coordinates::from(points),
    ))
}

#[test]
fn piercing_triangles_intersect() {
    let mesh = mesh(
        vec![[0, 1, 2], [3, 4, 5]],
        vec![
            [0.0, 0.0, 0.0],
            [2.0, 0.0, 0.0],
            [0.0, 2.0, 0.0],
            [0.5, 0.5, -1.0],
            [0.5, 0.5, 1.0],
            [1.0, 1.0, 0.0],
        ],
    );
    assert_eq!(mesh.self_intersections(), vec![[0, 1]]);
}

#[test]
fn separated_triangles_do_not_intersect() {
    let mesh = mesh(
        vec![[0, 1, 2], [3, 4, 5]],
        vec![
            [0.0, 0.0, 0.0],
            [1.0, 0.0, 0.0],
            [0.0, 1.0, 0.0],
            [0.0, 0.0, 5.0],
            [1.0, 0.0, 5.0],
            [0.0, 1.0, 5.0],
        ],
    );
    assert!(mesh.self_intersections().is_empty());
}

#[test]
fn adjacent_triangles_are_not_self_intersections() {
    let mesh = mesh(
        vec![[0, 1, 2], [0, 1, 3]],
        vec![
            [0.0, 0.0, 0.0],
            [1.0, 0.0, 0.0],
            [0.0, 1.0, 0.0],
            [0.0, -1.0, 0.5],
        ],
    );
    assert!(mesh.self_intersections().is_empty());
}