ncollide3d/utils/
point_in_poly2d.rs

1use na::{Point2, RealField};
2
3// FIXME: move this on ncollide_geometry.
4/// Tests if the given point is inside of a polygon with arbitrary orientation.
5pub fn point_in_poly2d<N: RealField + Copy>(pt: &Point2<N>, poly: &[Point2<N>]) -> bool {
6    if poly.len() == 0 {
7        false
8    } else {
9        let mut sign = N::zero();
10
11        for i1 in 0..poly.len() {
12            let i2 = (i1 + 1) % poly.len();
13            let seg_dir = poly[i2] - poly[i1];
14            let dpt = pt - poly[i1];
15            let perp = dpt.perp(&seg_dir);
16
17            if sign.is_zero() {
18                sign = perp;
19            } else if sign * perp < N::zero() {
20                return false;
21            }
22        }
23
24        return true;
25    }
26}