Skip to main content

use_triangulation/
lib.rs

1#![forbid(unsafe_code)]
2#![doc = include_str!("../README.md")]
3
4/// Triangulation method families.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum TriangulationMethod {
7    /// Ear-clipping polygon triangulation.
8    EarClipping,
9    /// Delaunay triangulation.
10    Delaunay,
11    /// Constrained triangulation.
12    Constrained,
13}
14
15impl TriangulationMethod {
16    /// Returns a stable method name.
17    #[must_use]
18    pub const fn name(self) -> &'static str {
19        match self {
20            Self::EarClipping => "ear-clipping",
21            Self::Delaunay => "delaunay",
22            Self::Constrained => "constrained",
23        }
24    }
25}
26
27/// A 2D triangulation represented by indexed triangles.
28#[derive(Debug, Clone, PartialEq, Eq)]
29pub struct Triangulation2 {
30    triangles: Vec<[usize; 3]>,
31}
32
33impl Triangulation2 {
34    /// Creates a triangulation from indexed triangles.
35    #[must_use]
36    pub const fn new(triangles: Vec<[usize; 3]>) -> Self {
37        Self { triangles }
38    }
39
40    /// Returns the indexed triangles.
41    #[must_use]
42    pub fn triangles(&self) -> &[[usize; 3]] {
43        &self.triangles
44    }
45
46    /// Returns the number of triangles.
47    #[must_use]
48    pub fn triangle_count(&self) -> usize {
49        self.triangles.len()
50    }
51}
52
53#[cfg(test)]
54mod tests {
55    use super::{Triangulation2, TriangulationMethod};
56
57    #[test]
58    fn stores_indexed_triangles() {
59        let triangulation = Triangulation2::new(vec![[0, 1, 2], [0, 2, 3]]);
60
61        assert_eq!(triangulation.triangle_count(), 2);
62        assert_eq!(triangulation.triangles()[0], [0, 1, 2]);
63        assert_eq!(TriangulationMethod::EarClipping.name(), "ear-clipping");
64    }
65}