The following is based on the "Fast Winding Number Inclusion of a Point
in a Polygon" algorithm by Dan Sunday.
http://softsurfer.com/Archive/algorithm_0103/algorithm_0103.htm#Winding%20Number
Return:
- LW_INSIDE (1) if the point is inside the POINTARRAY
- LW_BOUNDARY (0) if it is on the boundary.
- LW_OUTSIDE (-1) if it is outside
Definition at line 755 of file ptarray.c.
763 lwerror(
"ptarray_contains_point called on unclosed ring");
765 for (uint32_t i = 1; i < pa->
npoints; i++)
767 double side, ymin, ymax;
782 if (pt->
y > ymax || pt->
y < ymin)
804 if ((side < 0) && (seg1->
y <= pt->
y) && (pt->
y < seg2->
y))
814 else if ( (side > 0) && (seg2->
y <= pt->
y) && (pt->
y < seg1->
y) )
#define LW_INSIDE
Constants for point-in-polygon return values.
int lw_pt_in_seg(const POINT2D *P, const POINT2D *A1, const POINT2D *A2)
Returns true if P is between A1/A2.
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
int p2d_same(const POINT2D *p1, const POINT2D *p2)
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
References FP_MAX, FP_MIN, getPoint2d_cp(), LW_BOUNDARY, LW_INSIDE, LW_OUTSIDE, lw_pt_in_seg(), lw_segment_side(), lwerror(), POINTARRAY::npoints, p2d_same(), and POINT2D::y.
Referenced by _lwt_AddFaceSplit(), lw_dist2d_line_poly(), lw_dist2d_line_tri(), lw_dist2d_point_poly(), lw_dist2d_point_tri(), lw_dist2d_poly_poly(), lw_dist2d_tri_circstring(), lw_dist2d_tri_poly(), lw_dist2d_tri_tri(), lwgeom_contains_point(), lwgeom_solid_contains_lwgeom(), lwpoly_contains_point(), and test_ptarray_contains_point().