1#![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}