Ray casting

boolean inside(Point p, Point[] poly) {
  boolean in = false;
  int n = poly.length;
  for (int i = 0, j = n - 1; i < n; j = i++) {
    if ((poly[i].y > p.y) != (poly[j].y > p.y) &&
        p.x < (poly[j].x - poly[i].x) * (p.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
      in = !in;
  }
  return in;
}
Advertisement

Winding number

Sum signed angle subtended by consecutive vertices from p. Nonzero → inside (2π for simple polygons).

Advertisement

Complex polygons

Ray casting: even-odd rule. Winding: nonzero rule. Different for self-intersecting polygons.

Complexity

O(N) per query. O(log N) with preprocessing for convex or via slab decomposition.