PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ 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 415 of file shp2pgsql-core.c.

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

Referenced by FindPolygons().

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