1extern crate nalgebra as na;
2
3use na::{SVector,SVectorView};
4
5pub struct Triangle<const D: usize> {
7 v0: SVector::<f32,D>,
8 v1: SVector::<f32,D>,
9 v2: SVector::<f32,D>,
10 id0: Option<usize>,
11 id1: Option<usize>,
12 id2: Option<usize>,
13}
14
15impl<const D: usize> Triangle<D> {
16 pub fn from_vec(v0: &SVector::<f32,D>, id0: Option<usize>, v1: &SVector::<f32,D>, id1: Option<usize>, v2: &SVector::<f32,D>, id2: Option<usize>) -> Triangle<D> {
17 assert_ne!(v0,v1);
18 assert_ne!(v0,v2);
19 assert_ne!(v1,v2);
20 Triangle::<D> {v0: v0.clone(), v1: v1.clone(), v2: v2.clone(), id0, id1, id2}
21 }
22
23 pub fn from_view(v0: &SVectorView::<f32,D>, id0: Option<usize>, v1: &SVectorView::<f32,D>, id1: Option<usize>, v2: &SVectorView::<f32,D>, id2: Option<usize>) -> Triangle<D> {
24 assert_ne!(v0,v1);
25 assert_ne!(v0,v2);
26 assert_ne!(v1,v2);
27 Triangle::<D> {v0: v0.into_owned(), v1: v1.into_owned(), v2: v2.into_owned(), id0, id1, id2}
28 }
29
30 pub fn calculate_boudning_box(&self) -> (SVector<f32,D>, SVector<f32,D>) {
34 let mut min_arr = [0f32;D];
35 let mut max_arr = [0f32;D];
36
37 for i in 0..D {
38 let min = self.v0[i].min(self.v1[i].min(self.v2[i]));
39 let max = self.v0[i].max(self.v1[i].max(self.v2[i]));
40 min_arr[i] = min;
41 max_arr[i] = max;
42 }
43
44 (SVector::<f32,D>::from(min_arr), SVector::<f32,D>::from(max_arr))
45 }
46
47 pub fn get_v0(&self) -> SVector::<f32,D> {self.v0}
48 pub fn get_v1(&self) -> SVector::<f32,D> {self.v1}
49 pub fn get_v2(&self) -> SVector::<f32,D> {self.v2}
50 pub fn get_id0(&self) -> Option<usize> {self.id0}
51 pub fn get_id1(&self) -> Option<usize> {self.id1}
52 pub fn get_id2(&self) -> Option<usize> {self.id2}
53
54}
55
56