graphics_shapes/intersection/
rect.rs1use 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}