PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ PIP()

int PIP ( Point  P,
Point V,
int  n 
)

PIP(): crossing number test for a point in a polygon input: P = a point, V[] = vertex points of a polygon V[n+1] with V[n]=V[0].

Returns
0 = outside, 1 = inside

Definition at line 417 of file shp2pgsql-core.c.

418{
419 int cn = 0; /* the crossing number counter */
420 int i;
421
422 /* loop through all edges of the polygon */
423 for (i = 0; i < n-1; i++) /* edge from V[i] to V[i+1] */
424 {
425 if (((V[i].y <= P.y) && (V[i + 1].y > P.y)) /* an upward crossing */
426 || ((V[i].y > P.y) && (V[i + 1].y <= P.y))) /* a downward crossing */
427 {
428 double vt = (float)(P.y - V[i].y) / (V[i + 1].y - V[i].y);
429 if (P.x < V[i].x + vt * (V[i + 1].x - V[i].x)) /* P.x < intersect */
430 ++cn; /* a valid crossing of y=P.y right of P.x */
431 }
432 }
433
434 return (cn&1); /* 0 if even (out), and 1 if odd (in) */
435}

References struct_ring::n, struct_point::x, and struct_point::y.

Referenced by FindPolygons().

Here is the caller graph for this function: