PostGIS  3.4.0dev-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 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, struct_point::y, and pixval::y.

Referenced by FindPolygons().

Here is the caller graph for this function: