1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use crate::Plane;
use mini_math::{Point, Vector3};
#[derive(Debug)]
pub struct Triangle {
pub a: Point,
pub b: Point,
pub c: Point,
}
impl Triangle {
pub fn new(a: Point, b: Point, c: Point) -> Self {
Self { a, b, c }
}
pub(crate) fn barycentric_coordinates(&self, p: Point) -> Vector3 {
let e0 = self.b - self.a;
let e1 = self.c - self.a;
let e2 = p - self.a;
let d00 = e0.dot(e0);
let d01 = e0.dot(e1);
let d11 = e1.dot(e1);
let d20 = e2.dot(e0);
let d21 = e2.dot(e1);
let denom = 1.0 / (d00 * d11 - d01 * d01);
let v = (d11 * d20 - d01 * d21) * denom;
let w = (d00 * d21 - d01 * d20) * denom;
let u = 1.0 - v - w;
Vector3::new(u, v, w)
}
pub(crate) fn coplanar_point_inside(&self, p: Point) -> bool {
let plane = Plane::from(self);
let edge_cross = (self.b - self.a).cross(p - self.a);
if plane.normal.dot(edge_cross) > 0.0 {
return false;
}
let edge_cross = (self.c - self.b).cross(p - self.b);
if plane.normal.dot(edge_cross) > 0.0 {
return false;
}
let edge_cross = (self.a - self.c).cross(p - self.c);
if plane.normal.dot(edge_cross) > 0.0 {
return false;
}
true
}
}