models_cv/
triangle.rs

1extern crate nalgebra as na;
2
3use na::{SVector,SVectorView};
4
5// Assuming Counter-Clockwise winding order
6pub 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    /**
31     * Returns a bound box with (min, max) coordinates in the triangle's coordiante system
32     */
33    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