microcad_core/geo3d/
triangle.rs1use cgmath::{InnerSpace, Vector3};
7
8use crate::*;
9
10impl Triangle<Vector3<f32>> {
11 pub fn normal(&self) -> Vector3<f32> {
13 (self.2 - self.0).cross(self.1 - self.0)
14 }
15}
16
17impl Triangle<&Vector3<f32>> {
18 pub fn normal(&self) -> Vector3<f32> {
20 (self.2 - self.0).cross(self.1 - self.0)
21 }
22
23 pub fn area(&self) -> f32 {
25 self.normal().magnitude()
26 }
27
28 pub fn signed_volume(&self) -> f32 {
32 let v210 = self.2.x * self.1.y * self.0.z;
33 let v120 = self.1.x * self.2.y * self.0.z;
34 let v201 = self.2.x * self.0.y * self.1.z;
35 let v021 = self.0.x * self.2.y * self.1.z;
36 let v102 = self.1.x * self.0.y * self.2.z;
37 let v012 = self.0.x * self.1.y * self.2.z;
38
39 (1.0 / 6.0) * (-v210 + v120 + v201 - v021 - v102 + v012)
40 }
41}