meshmeshmesh/
triangle.rs

1use crate::point::Point;
2
3/// Represents a triangle in three-dimensional space.
4///
5/// Sometimes it's easier to work with separate triangles rather than using a `Mesh`.
6///
7/// # Example
8///
9/// ```
10/// use meshmeshmesh::point::Point;
11/// use meshmeshmesh::triangle::Triangle;
12///
13/// let result = Triangle::new(
14/// Point::new(0.0, 0.0, 0.0),
15/// Point::new(10.0, 0.0, 0.0),
16/// Point::new(10.0, -15.0, 0.0));
17///
18/// assert_eq!(result.first_point.eq(&Point::new(0.0, 0.0, 0.0)), true);
19/// assert_eq!(result.second_point.eq(&Point::new(10.0, 0.0, 0.0)), true);
20/// assert_eq!(result.third_point.eq(&Point::new(10.0, -15.0, 0.0)), true);
21/// ```
22#[derive(Debug, Clone, Copy)]
23pub struct Triangle {
24    /// First point.
25    pub first_point: Point,
26    /// Second point.
27    pub second_point: Point,
28    /// Third point.
29    pub third_point: Point,
30}
31
32impl PartialEq for Triangle {
33    fn eq(&self, other: &Self) -> bool {
34        self.first_point.eq(&other.first_point) && self.second_point.eq(&other.second_point) && self.third_point.eq(&other.third_point)
35    }
36}
37
38impl Triangle {
39    /// Returns a new [Triangle]
40    ///
41    /// # Example
42    ///
43    /// ```
44    /// use meshmeshmesh::point::Point;
45    /// use meshmeshmesh::triangle::Triangle;
46    ///
47    /// let result = Triangle::new(
48    /// Point::new(0.0, 0.0, 0.0),
49    /// Point::new(10.0, 0.0, 0.0),
50    /// Point::new(10.0, -15.0, 0.0));
51    ///
52    /// assert_eq!(result.first_point.eq(&Point::new(0.0, 0.0, 0.0)), true);
53    /// assert_eq!(result.second_point.eq(&Point::new(10.0, 0.0, 0.0)), true);
54    /// assert_eq!(result.third_point.eq(&Point::new(10.0, -15.0, 0.0)), true);
55    /// ```
56    pub fn new(first_point: Point, second_point: Point, third_point: Point) -> Triangle { Triangle { first_point, second_point, third_point } }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_new() {
65        let result = Triangle::new(
66            Point::new(0.0, 0.0, 0.0),
67            Point::new(10.0, 0.0, 0.0),
68            Point::new(10.0, -15.0, 0.0));
69        assert_eq!(result.first_point.eq(&Point::new(0.0, 0.0, 0.0)), true);
70        assert_eq!(result.second_point.eq(&Point::new(10.0, 0.0, 0.0)), true);
71        assert_eq!(result.third_point.eq(&Point::new(10.0, -15.0, 0.0)), true);
72    }
73
74    #[test]
75    fn test_partialeq_true() {
76        let a = Triangle::new(
77            Point::new(0.0, 0.0, 0.0),
78            Point::new(10.0, 0.0, 0.0),
79            Point::new(10.0, -15.0, 0.0));
80        let b = Triangle::new(
81            Point::new(0.0, 0.0, 0.0),
82            Point::new(10.0, 0.0, 0.0),
83            Point::new(10.0, -15.0, 0.0));
84        assert_eq!(a.eq(&b), true);
85        assert_eq!(b.eq(&a), true);
86    }
87
88    #[test]
89    fn test_partialeq_first_different_false() {
90        let a = Triangle::new(
91            Point::new(0.0, 0.0, 0.0),
92            Point::new(10.0, 0.0, 0.0),
93            Point::new(10.0, -15.0, 0.0));
94        let b = Triangle::new(
95            Point::new(0.0, 0.0, -7.0),
96            Point::new(10.0, 0.0, 0.0),
97            Point::new(10.0, -15.0, 0.0));
98        assert_eq!(a.eq(&b), false);
99        assert_eq!(b.eq(&a), false);
100    }
101
102    #[test]
103    fn test_partialeq_second_different_false() {
104        let a = Triangle::new(
105            Point::new(0.0, 0.0, 0.0),
106            Point::new(10.0, 0.0, 0.0),
107            Point::new(10.0, -15.0, 0.0));
108        let b = Triangle::new(
109            Point::new(0.0, 0.0, 0.0),
110            Point::new(10.0, 2.1, 0.0),
111            Point::new(10.0, -15.0, 0.0));
112        assert_eq!(a.eq(&b), false);
113        assert_eq!(b.eq(&a), false);
114    }
115
116    #[test]
117    fn test_partialeq_third_different_false() {
118        let a = Triangle::new(
119            Point::new(0.0, 0.0, 0.0),
120            Point::new(10.0, 0.0, 0.0),
121            Point::new(10.0, -15.0, 0.0));
122        let b = Triangle::new(
123            Point::new(0.0, 0.0, 0.0),
124            Point::new(10.0, 0.0, 0.0),
125            Point::new(101.0, -15.0, 0.0));
126        assert_eq!(a.eq(&b), false);
127        assert_eq!(b.eq(&a), false);
128    }
129
130    #[test]
131    fn test_partialeq_all_different_false() {
132        let a = Triangle::new(
133            Point::new(0.0, 0.0, 0.0),
134            Point::new(10.0, 0.0, 0.0),
135            Point::new(10.0, -15.0, 0.0));
136        let b = Triangle::new(
137            Point::new(0.0, -0.1, 0.0),
138            Point::new(-10.0, 0.0, 5.0),
139            Point::new(101.0, 76.0, 0.0));
140        assert_eq!(a.eq(&b), false);
141        assert_eq!(b.eq(&a), false);
142    }
143}