graphics_shapes/intersection/
ellipse.rs

1use crate::intersection::shared::{
2    ellipse_circle, line_ellipse, lines_lines, polygon_ellipse, rect_ellipse, triangle_ellipse,
3};
4use crate::prelude::*;
5
6impl IntersectsShape for Ellipse {
7    fn intersects_rect(&self, rect: &Rect) -> bool {
8        rect_ellipse(rect, self)
9    }
10
11    fn intersects_circle(&self, circle: &Circle) -> bool {
12        ellipse_circle(self, circle)
13    }
14
15    fn intersects_line(&self, line: &Line) -> bool {
16        line_ellipse(line, self)
17    }
18
19    fn intersects_triangle(&self, triangle: &Triangle) -> bool {
20        triangle_ellipse(triangle, self)
21    }
22
23    fn intersects_ellipse(&self, ellipse: &Ellipse) -> bool {
24        lines_lines(
25            &self.as_polygon().as_lines(),
26            &ellipse.as_polygon().as_lines(),
27        )
28    }
29
30    fn intersects_polygon(&self, polygon: &Polygon) -> bool {
31        polygon_ellipse(polygon, self)
32    }
33}
34
35#[cfg(test)]
36mod test {
37    use crate::prelude::*;
38
39    #[test]
40    fn line_below_ellipse_at_zero() {
41        let line = Line::new((6, 47), (26, 67));
42        let ellipse = Ellipse::new((1, 2), 124, 78);
43        assert!(!line.intersects_ellipse(&ellipse));
44        assert!(!ellipse.intersects_line(&line));
45    }
46
47    #[test]
48    fn line_intersecting_ellipse_at_zero() {
49        let line = Line::new((15, 30), (35, 50));
50        let ellipse = Ellipse::new((1, 2), 124, 78);
51        assert!(line.intersects_ellipse(&ellipse));
52        assert!(ellipse.intersects_line(&line));
53    }
54
55    #[test]
56    fn line_inside_ellipse_at_zero() {
57        let line = Line::new((7, 4), (27, 24));
58        let ellipse = Ellipse::new((1, 2), 124, 78);
59        assert!(!line.intersects_ellipse(&ellipse));
60        assert!(!ellipse.intersects_line(&line));
61    }
62
63    #[test]
64    fn line_inside_ellipse() {
65        let line = Line::new((101, 119), (121, 139));
66        let ellipse = Ellipse::new((111, 129), 82, 52);
67        assert!(!line.intersects_ellipse(&ellipse));
68        assert!(!ellipse.intersects_line(&line));
69    }
70
71    #[test]
72    fn line_above_ellipse() {
73        let line = Line::new((97, 57), (117, 77));
74        let ellipse = Ellipse::new((111, 129), 82, 52);
75        assert!(!line.intersects_ellipse(&ellipse));
76        assert!(!ellipse.intersects_line(&line));
77    }
78
79    #[test]
80    fn line_intersecting_ellipse() {
81        let line = Line::new((105, 145), (125, 165));
82        let ellipse = Ellipse::new((111, 129), 82, 52);
83        assert!(line.intersects_ellipse(&ellipse));
84        assert!(ellipse.intersects_line(&line));
85    }
86
87    #[test]
88    fn line_inside_rotated_ellipse() {
89        let line = Line::new((114, 90), (134, 110));
90        let ellipse = Ellipse::new((147, 131), 120, 80).rotate(48);
91        assert!(!line.intersects_ellipse(&ellipse));
92        assert!(!ellipse.intersects_line(&line));
93    }
94
95    #[test]
96    fn line_left_of_rotated_ellipse() {
97        let line = Line::new((91, 145), (111, 165));
98        let ellipse = Ellipse::new((147, 131), 120, 80).rotate(48);
99        assert!(!line.intersects_ellipse(&ellipse));
100        assert!(!ellipse.intersects_line(&line));
101    }
102
103    #[test]
104    fn line_intersecting_rotated_ellipse() {
105        let line = Line::new((167, 172), (187, 192));
106        let ellipse = Ellipse::new((147, 131), 120, 80).rotate(48);
107        assert!(line.intersects_ellipse(&ellipse));
108        assert!(ellipse.intersects_line(&line));
109    }
110}