graphics_shapes/intersection/
rect.rs

1use crate::intersection::shared::*;
2use crate::prelude::*;
3
4impl IntersectsShape for Rect {
5    fn intersects_rect(&self, rect: &Rect) -> bool {
6        lines_lines(&self.as_lines(), &rect.as_lines())
7    }
8
9    fn intersects_circle(&self, circle: &Circle) -> bool {
10        rect_circle(self, circle)
11    }
12
13    fn intersects_line(&self, line: &Line) -> bool {
14        line_rect(line, self)
15    }
16
17    fn intersects_triangle(&self, triangle: &Triangle) -> bool {
18        lines_lines(&self.as_lines(), &triangle.as_lines())
19    }
20
21    fn intersects_ellipse(&self, ellipse: &Ellipse) -> bool {
22        rect_ellipse(self, ellipse)
23    }
24
25    fn intersects_polygon(&self, polygon: &Polygon) -> bool {
26        lines_lines(&self.as_lines(), &polygon.as_lines())
27    }
28}
29
30#[cfg(test)]
31mod test {
32    mod rect_rect {
33        use crate::intersection::IntersectsShape;
34        use crate::rect::Rect;
35
36        #[test]
37        fn non_intersecting() {
38            let left = Rect::new((10, 10), (20, 20));
39            let right = Rect::new((30, 10), (40, 20));
40            assert!(!left.intersects_rect(&right));
41            assert!(!right.intersects_rect(&left));
42        }
43
44        #[test]
45        fn fully_overlapping() {
46            let left = Rect::new((10, 10), (20, 20));
47            let right = Rect::new((10, 10), (20, 20));
48            assert!(left.intersects_rect(&right));
49            assert!(right.intersects_rect(&left));
50        }
51
52        #[test]
53        fn inside() {
54            let left = Rect::new((10, 10), (40, 40));
55            let right = Rect::new((20, 20), (30, 30));
56            assert!(!left.intersects_rect(&right));
57            assert!(!right.intersects_rect(&left));
58        }
59
60        #[test]
61        fn wide_and_tall() {
62            let left = Rect::new((30, 10), (40, 60));
63            let right = Rect::new((0, 30), (60, 40));
64            assert!(left.intersects_rect(&right));
65            assert!(right.intersects_rect(&left));
66        }
67
68        #[test]
69        fn wide_and_tall_separated() {
70            let left = Rect::new((30, 10), (40, 60));
71            let right = Rect::new((100, 30), (160, 40));
72            assert!(!left.intersects_rect(&right));
73            assert!(!right.intersects_rect(&left));
74        }
75
76        #[test]
77        fn partly_inside() {
78            let left = Rect::new((10, 10), (70, 70));
79            let right = Rect::new((30, 30), (100, 50));
80            assert!(left.intersects_rect(&right));
81            assert!(right.intersects_rect(&left));
82        }
83
84        #[test]
85        fn partly_inside_separated() {
86            let left = Rect::new((10, 10), (70, 70));
87            let right = Rect::new((130, 30), (200, 50));
88            assert!(!left.intersects_rect(&right));
89            assert!(!right.intersects_rect(&left));
90        }
91
92        #[test]
93        fn off_by_one() {
94            let left = Rect::new((10, 10), (20, 20));
95            let right = Rect::new((11, 10), (21, 20));
96            assert!(left.intersects_rect(&right));
97            assert!(right.intersects_rect(&left));
98        }
99    }
100}