pt_in_ring_3d(): crossing number test for a point in a polygon input: p = a point, pa = vertex points of a ring V[n+1] with V[n]=V[0] plane=the plane that the vertex points are lying on returns: 0 = outside, 1 = inside
Our polygons have first and last point the same,
The difference in 3D variant is that we exclude the dimension that faces the plane least. That is the dimension with the highest number in pv
Definition at line 1283 of file measures3d.c.
References getPoint3dz_p(), LW_FALSE, LWDEBUGF, lwerror(), POINTARRAY::npoints, PLANE3D::pv, VECTOR3D::x, POINT3DZ::x, VECTOR3D::y, POINT3DZ::y, VECTOR3D::z, and POINT3DZ::z.
Referenced by lw_dist3d_pt_poly(), and lw_dist3d_ptarray_poly().
1294 if ( memcmp(&first, &last,
sizeof(
POINT3DZ)) )
1296 lwerror(
"pt_in_ring_3d: V[n] != V[0] (%g %g %g!= %g %g %g)",
1297 first.
x, first.
y, first.
z, last.
x, last.
y, last.
z);
1301 LWDEBUGF(2,
"pt_in_ring_3d called with point: %g %g %g", p->
x, p->
y, p->
z);
1308 if(fabs(plane->
pv.
z)>=fabs(plane->
pv.
x)&&fabs(plane->
pv.
z)>=fabs(plane->
pv.
y))
1310 for (i=0; i<ring->
npoints-1; i++)
1319 ((v1.
y <= p->
y) && (v2.
y > p->
y))
1321 || ((v1.
y > p->
y) && (v2.
y <= p->
y))
1325 vt = (double)(p->
y - v1.
y) / (v2.
y - v1.
y);
1328 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1337 else if(fabs(plane->
pv.
y)>=fabs(plane->
pv.
x)&&fabs(plane->
pv.
y)>=fabs(plane->
pv.
z))
1339 for (i=0; i<ring->
npoints-1; i++)
1348 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1350 || ((v1.
z > p->
z) && (v2.
z <= p->
z))
1354 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1357 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1368 for (i=0; i<ring->
npoints-1; i++)
1377 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1379 || ((v1.
z > p->
z) && (v2.
z <= p->
z))
1383 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1386 if (p->
y < v1.
y + vt * (v2.
y - v1.
y))
1395 LWDEBUGF(3,
"pt_in_ring_3d returning %d", cn&1);
int getPoint3dz_p(const POINTARRAY *pa, int n, POINT3DZ *point)
#define LWDEBUGF(level, msg,...)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.