1use geometry_strategy::intersects::Reversed;
11use geometry_strategy::{CartesianIntersects, IntersectsStrategy};
12
13#[inline]
21#[must_use]
22pub fn intersects<A, B>(a: &A, b: &B) -> bool
23where
24 CartesianIntersects: IntersectsStrategy<A, B>,
25{
26 CartesianIntersects.intersects(a, b)
27}
28
29#[inline]
33#[must_use]
34pub fn intersects_reversed<A, B>(a: &A, b: &B) -> bool
35where
36 Reversed<CartesianIntersects>: IntersectsStrategy<A, B>,
37{
38 Reversed(CartesianIntersects).intersects(a, b)
39}
40
41#[cfg(test)]
42mod tests {
43 use super::intersects;
48 use geometry_cs::Cartesian;
49 use geometry_model::{Linestring, Point2D, Polygon, Segment, linestring, polygon};
50
51 type P = Point2D<f64, Cartesian>;
52 type LS = Linestring<P>;
53
54 fn pt(x: f64, y: f64) -> P {
55 Point2D::new(x, y)
56 }
57
58 #[test]
60 fn ls_crosses_segment() {
61 let ls: LS = linestring![(1.0, 1.0), (3.0, 3.0), (2.0, 5.0)];
62 let s = Segment::new(pt(2.0, 0.0), pt(2.0, 6.0));
63 assert!(intersects(&ls, &s));
64 }
65
66 #[test]
68 fn ls_touches_segment_endpoint() {
69 let ls: LS = linestring![(1.0, 1.0), (3.0, 3.0)];
70 let s = Segment::new(pt(1.0, 0.0), pt(1.0, 1.0));
71 assert!(intersects(&ls, &s));
72 }
73
74 #[test]
76 fn ls_disjoint_from_segment() {
77 let ls: LS = linestring![(1.0, 1.0), (3.0, 3.0)];
78 let s = Segment::new(pt(3.0, 0.0), pt(4.0, 1.0));
79 assert!(!intersects(&ls, &s));
80 }
81
82 #[test]
84 fn ls_crosses_ls() {
85 let a: LS = linestring![(0.0, 0.0), (2.0, 0.0), (3.0, 0.0)];
86 let b: LS = linestring![(0.0, 0.0), (1.0, 1.0), (2.0, 2.0)];
87 assert!(intersects(&a, &b));
88 }
89
90 #[test]
92 fn ls_overlap_collinear() {
93 let a: LS = linestring![(0.0, 0.0), (2.0, 0.0), (3.0, 0.0)];
94 let b: LS = linestring![(1.0, 0.0), (4.0, 0.0), (5.0, 0.0)];
95 assert!(intersects(&a, &b));
96 }
97
98 #[test]
100 fn ls_inside_polygon() {
101 let ls: LS = linestring![(1.0, 1.0), (2.0, 2.0)];
102 let p: Polygon<P> = polygon![[
103 (0.0, 0.0),
104 (10.0, 0.0),
105 (10.0, 10.0),
106 (0.0, 10.0),
107 (0.0, 0.0)
108 ]];
109 assert!(intersects(&ls, &p));
110 }
111
112 #[test]
114 fn ls_outside_polygon() {
115 let ls: LS = linestring![(11.0, 0.0), (12.0, 12.0)];
116 let p: Polygon<P> = polygon![[
117 (0.0, 0.0),
118 (10.0, 0.0),
119 (10.0, 10.0),
120 (0.0, 10.0),
121 (0.0, 0.0)
122 ]];
123 assert!(!intersects(&ls, &p));
124 }
125
126 #[test]
130 fn reversed_pair_agrees() {
131 let ls: LS = linestring![(1.0, 1.0), (2.0, 2.0)];
132 let p: Polygon<P> = polygon![[
133 (0.0, 0.0),
134 (10.0, 0.0),
135 (10.0, 10.0),
136 (0.0, 10.0),
137 (0.0, 0.0)
138 ]];
139 assert_eq!(intersects(&ls, &p), intersects(&p, &ls));
140 }
141}