rita/
lib.rs

1//! # Rita
2//!
3//! An implementation of 2D and 3D weighted delaunay triangulation via incremental algorithms.
4#![forbid(unsafe_code)]
5#![deny(unused, clippy::incompatible_msrv)]
6
7pub use node::VertexNode;
8pub use tetrahedralization::Tetrahedralization;
9pub use triangulation::Triangulation;
10
11pub mod node;
12mod tetds;
13pub mod tetrahedralization;
14pub mod triangulation;
15mod trids;
16mod utils;
17
18#[cfg(test)]
19mod test_utils {
20    use std::ops::RangeInclusive;
21
22    use rand::{distr::Uniform, prelude::Distribution};
23    use rand_distr::Normal;
24    pub fn sample_vertices_2d(n: usize, range: Option<RangeInclusive<f64>>) -> Vec<[f64; 2]> {
25        let mut rng = rand::rng();
26        let range = range.unwrap_or(-0.5..=0.5);
27        let uniform = Uniform::try_from(range).expect("Expected a valid range");
28
29        let mut vertices: Vec<[f64; 2]> = Vec::with_capacity(n);
30        for _ in 0..n {
31            let x = uniform.sample(&mut rng);
32            let y = uniform.sample(&mut rng);
33            vertices.push([x, y]);
34        }
35
36        vertices
37    }
38
39    pub fn sample_vertices_3d(n: usize, range: Option<RangeInclusive<f64>>) -> Vec<[f64; 3]> {
40        let mut rng = rand::rng();
41        let range = range.unwrap_or(-0.5..=0.5);
42        let uniform = Uniform::try_from(range).expect("Expected a valid range");
43
44        let mut vertices: Vec<[f64; 3]> = Vec::with_capacity(n);
45        for _ in 0..n {
46            let x = uniform.sample(&mut rng);
47            let y = uniform.sample(&mut rng);
48            let z = uniform.sample(&mut rng);
49
50            vertices.push([x, y, z]);
51        }
52
53        vertices
54    }
55
56    pub fn sample_weights(n: usize, params: Option<(f64, f64)>) -> Vec<f64> {
57        let mut rng = rand::rng();
58        let (mean, std_dev) = params.unwrap_or((0.0, 0.005));
59        let normal = Normal::new(mean, std_dev).unwrap();
60
61        let mut weights: Vec<f64> = Vec::with_capacity(n);
62        for _ in 0..n {
63            let w: f64 = normal.sample(&mut rng);
64            weights.push(w);
65        }
66
67        weights
68    }
69}