geo/algorithm/intersects/
triangle.rs

1use super::Intersects;
2use crate::*;
3
4impl<T> Intersects<Coord<T>> for Triangle<T>
5where
6    T: GeoNum,
7{
8    fn intersects(&self, rhs: &Coord<T>) -> bool {
9        let mut orientations = self
10            .to_lines()
11            .map(|l| T::Ker::orient2d(l.start, l.end, *rhs));
12
13        orientations.sort();
14
15        !orientations
16            .windows(2)
17            .any(|win| win[0] != win[1] && win[1] != Orientation::Collinear)
18
19        // // neglecting robust predicates, hence faster
20        // let p0x = self.0.x.to_f64().unwrap();
21        // let p0y = self.0.y.to_f64().unwrap();
22        // let p1x = self.1.x.to_f64().unwrap();
23        // let p1y = self.1.y.to_f64().unwrap();
24        // let p2x = self.2.x.to_f64().unwrap();
25        // let p2y = self.2.y.to_f64().unwrap();
26
27        // let px = rhs.x.to_f64().unwrap();
28        // let py = rhs.y.to_f64().unwrap();
29
30        // let s = (p0x - p2x) * (py - p2y) - (p0y - p2y) * (px - p2x);
31        // let t = (p1x - p0x) * (py - p0y) - (p1y - p0y) * (px - p0x);
32
33        // if (s < 0.) != (t < 0.) && s != 0. && t != 0. {
34        //     return false;
35        // }
36
37        // let d = (p2x - p1x) * (py - p1y) - (p2y - p1y) * (px - p1x);
38        // d == 0. || (d < 0.) == (s + t <= 0.)
39    }
40}
41
42symmetric_intersects_impl!(Triangle<T>, LineString<T>);
43symmetric_intersects_impl!(Triangle<T>, MultiLineString<T>);
44
45symmetric_intersects_impl!(Triangle<T>, Line<T>);
46
47symmetric_intersects_impl!(Triangle<T>, Point<T>);
48symmetric_intersects_impl!(Triangle<T>, MultiPoint<T>);
49
50symmetric_intersects_impl!(Triangle<T>, Polygon<T>);
51symmetric_intersects_impl!(Triangle<T>, MultiPolygon<T>);
52
53symmetric_intersects_impl!(Triangle<T>, Rect<T>);
54
55impl<T> Intersects<Triangle<T>> for Triangle<T>
56where
57    T: GeoNum,
58{
59    fn intersects(&self, rhs: &Triangle<T>) -> bool {
60        self.to_polygon().intersects(&rhs.to_polygon())
61    }
62}