graphics_shapes/intersection/
polygon.rs

1use crate::intersection::shared::*;
2use crate::prelude::*;
3
4impl IntersectsShape for Polygon {
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        polygon_circle(self, circle)
11    }
12
13    fn intersects_line(&self, line: &Line) -> bool {
14        line_polygon(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        polygon_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    use crate::prelude::*;
33
34    #[test]
35    fn circle_on_line() {
36        let polygon = Polygon::new(&[(50, 48), (206, 48), (206, 204), (128, 126), (50, 204)]);
37        let circle = Circle::new((113, 135), 15);
38        assert!(polygon.intersects_circle(&circle));
39        assert!(circle.intersects_polygon(&polygon));
40    }
41
42    #[test]
43    fn circle_below() {
44        let polygon = Polygon::new(&[(44, 36), (222, 36), (222, 214), (133, 125), (44, 214)]);
45        let circle = Circle::new((115, 180), 15);
46        assert!(!polygon.intersects_circle(&circle));
47        assert!(!circle.intersects_polygon(&polygon));
48    }
49
50    #[test]
51    fn circle_on_top_line() {
52        let polygon = Polygon::new(&[(44, 36), (222, 36), (222, 214), (133, 125), (44, 214)]);
53        let circle = Circle::new((72, 38), 15);
54        assert!(polygon.intersects_circle(&circle));
55        assert!(circle.intersects_polygon(&polygon));
56    }
57
58    #[test]
59    fn circle_inside() {
60        let polygon = Polygon::new(&[(44, 36), (222, 36), (222, 214), (133, 125), (44, 214)]);
61        let circle = Circle::new((128, 99), 15);
62        assert!(!polygon.intersects_circle(&circle));
63        assert!(!circle.intersects_polygon(&polygon));
64    }
65}