oxiphysics_geometry/geodesic/
types.rs1use super::functions::*;
6#[derive(Debug, Clone)]
8pub struct IsolineSegment {
9 pub start: [f64; 3],
11 pub end: [f64; 3],
13}
14#[derive(Debug, Clone)]
16pub struct GeoVoronoiCell {
17 pub source_idx: usize,
19 pub source_vertex: usize,
21 pub vertices: Vec<usize>,
23 pub area: f64,
25}
26#[derive(Debug, Clone)]
28pub struct IntrinsicDelaunay {
29 pub edge_lengths: Vec<[f64; 3]>,
32 pub faces: Vec<[usize; 3]>,
34 pub vertices: Vec<[f64; 3]>,
36}
37#[derive(Debug, Clone)]
39pub struct GeoMesh {
40 pub vertices: Vec<[f64; 3]>,
42 pub faces: Vec<[usize; 3]>,
44}
45impl GeoMesh {
46 pub fn new(vertices: Vec<[f64; 3]>, faces: Vec<[usize; 3]>) -> Self {
48 Self { vertices, faces }
49 }
50 pub fn n_vertices(&self) -> usize {
52 self.vertices.len()
53 }
54 pub fn n_faces(&self) -> usize {
56 self.faces.len()
57 }
58 pub fn build_adjacency(&self) -> Vec<Vec<(usize, f64)>> {
61 let n = self.vertices.len();
62 let mut adj: Vec<Vec<(usize, f64)>> = vec![Vec::new(); n];
63 for face in &self.faces {
64 let [a, b, c] = *face;
65 let lab = dist3(self.vertices[a], self.vertices[b]);
66 let lbc = dist3(self.vertices[b], self.vertices[c]);
67 let lca = dist3(self.vertices[c], self.vertices[a]);
68 adj[a].push((b, lab));
69 adj[b].push((a, lab));
70 adj[b].push((c, lbc));
71 adj[c].push((b, lbc));
72 adj[c].push((a, lca));
73 adj[a].push((c, lca));
74 }
75 adj
76 }
77 pub fn face_area(&self, face_idx: usize) -> f64 {
79 let [a, b, c] = self.faces[face_idx];
80 let va = self.vertices[a];
81 let vb = self.vertices[b];
82 let vc = self.vertices[c];
83 let ab = sub3(vb, va);
84 let ac = sub3(vc, va);
85 len3(cross3(ab, ac)) * 0.5
86 }
87 pub fn face_normal_raw(&self, face_idx: usize) -> [f64; 3] {
89 let [a, b, c] = self.faces[face_idx];
90 let ab = sub3(self.vertices[b], self.vertices[a]);
91 let ac = sub3(self.vertices[c], self.vertices[a]);
92 cross3(ab, ac)
93 }
94}
95pub struct HeatGeodesicResult {
97 pub distances: Vec<f64>,
99 pub gradient: Vec<[f64; 3]>,
101}
102#[derive(PartialEq)]
104pub(super) struct DijkEntry {
105 pub(super) dist: f64,
106 pub(super) vertex: usize,
107}