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 1277 of file measures3d.c.
1288 if ( memcmp(&first, &last,
sizeof(
POINT3DZ)) )
1290 lwerror(
"pt_in_ring_3d: V[n] != V[0] (%g %g %g!= %g %g %g)",
1291 first.
x, first.
y, first.
z, last.
x, last.
y, last.
z);
1295 LWDEBUGF(2,
"pt_in_ring_3d called with point: %g %g %g", p->
x, p->
y, p->
z);
1302 if(fabs(plane->
pv.
z)>=fabs(plane->
pv.
x)&&fabs(plane->
pv.
z)>=fabs(plane->
pv.
y))
1304 for (i=0; i<ring->
npoints-1; i++)
1313 ((v1.
y <= p->
y) && (v2.
y > p->
y))
1315 || ((v1.
y > p->
y) && (v2.
y <= p->
y))
1319 vt = (double)(p->
y - v1.
y) / (v2.
y - v1.
y);
1322 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1331 else if(fabs(plane->
pv.
y)>=fabs(plane->
pv.
x)&&fabs(plane->
pv.
y)>=fabs(plane->
pv.
z))
1333 for (i=0; i<ring->
npoints-1; i++)
1342 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1344 || ((v1.
z > p->
z) && (v2.
z <= p->
z))
1348 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1351 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1362 for (i=0; i<ring->
npoints-1; i++)
1371 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1373 || ((v1.
z > p->
z) && (v2.
z <= p->
z))
1377 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1380 if (p->
y < v1.
y + vt * (v2.
y - v1.
y))
1389 LWDEBUGF(3,
"pt_in_ring_3d returning %d", cn&1);
int getPoint3dz_p(const POINTARRAY *pa, uint32_t n, POINT3DZ *point)
#define LWDEBUGF(level, msg,...)
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
References getPoint3dz_p(), LW_FALSE, LWDEBUGF, lwerror(), POINTARRAY::npoints, PLANE3D::pv, POINT3DZ::x, VECTOR3D::x, POINT3DZ::y, VECTOR3D::y, POINT3DZ::z, and VECTOR3D::z.
Referenced by lw_dist3d_pt_poly(), and lw_dist3d_ptarray_poly().