ncollide3d/bounding_volume/
aabb_triangle.rs1use crate::{
2 bounding_volume::{HasBoundingVolume, AABB},
3 math::{Isometry, Point, DIM},
4 shape::Triangle,
5};
6use na::RealField;
7
8impl<N: RealField + Copy> HasBoundingVolume<N, AABB<N>> for Triangle<N> {
9 #[inline]
10 fn bounding_volume(&self, m: &Isometry<N>) -> AABB<N> {
11 let a = m.transform_point(&self.a).coords;
12 let b = m.transform_point(&self.b).coords;
13 let c = m.transform_point(&self.c).coords;
14
15 let mut min = Point::origin();
16 let mut max = Point::origin();
17
18 for d in 0..DIM {
19 min.coords[d] = a[d].min(b[d]).min(c[d]);
20 max.coords[d] = a[d].max(b[d]).max(c[d]);
21 }
22
23 AABB::new(min, max)
24 }
25
26 #[inline]
27 fn local_bounding_volume(&self) -> AABB<N> {
28 let a = self.a.coords;
29 let b = self.b.coords;
30 let c = self.c.coords;
31
32 let mut min = Point::origin();
33 let mut max = Point::origin();
34
35 for d in 0..DIM {
36 min.coords[d] = a[d].min(b[d]).min(c[d]);
37 max.coords[d] = a[d].max(b[d]).max(c[d]);
38 }
39
40 AABB::new(min, max)
41 }
42}
43
44#[cfg(test)]
45#[cfg(feature = "dim3")]
46mod test {
47 use crate::{
48 bounding_volume::support_map_aabb,
49 math::{Isometry, Point, Translation},
50 shape::{Shape, Triangle},
51 };
52 use na::{RealField, UnitQuaternion};
53
54 #[test]
55 fn triangle_aabb_matches_support_map_aabb() {
56 let t = Triangle::new(
57 Point::new(0.3, -0.1, 0.2),
58 Point::new(-0.7, 1.0, 0.0),
59 Point::new(-0.7, 1.5, 0.0),
60 );
61
62 let m = Isometry::from_parts(
63 Translation::new(-0.2, 5.0, 0.2),
64 UnitQuaternion::from_euler_angles(0.0, f32::frac_pi_2(), 0.0),
65 );
66
67 assert_eq!(t.aabb(&m), support_map_aabb(&m, &t));
68
69 }
72}