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