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 1567 of file measures3d.c.
1578 if (memcmp(&first, &last,
sizeof(
POINT3DZ)))
1580 lwerror(
"pt_in_ring_3d: V[n] != V[0] (%g %g %g!= %g %g %g)",
1590 LWDEBUGF(2,
"pt_in_ring_3d called with point: %g %g %g", p->
x, p->
y, p->
z);
1596 if (fabs(plane->
pv.
z) >= fabs(plane->
pv.
x) &&
1597 fabs(plane->
pv.
z) >= fabs(plane->
pv.
y))
1600 for (i = 0; i < ring->
npoints - 1; i++)
1608 ((v1.
y <= p->
y) && (v2.
y > p->
y))
1610 || ((v1.
y > p->
y) && (v2.
y <= p->
y)))
1613 vt = (double)(p->
y - v1.
y) / (v2.
y - v1.
y);
1616 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1625 else if (fabs(plane->
pv.
y) >= fabs(plane->
pv.
x) &&
1626 fabs(plane->
pv.
y) >= fabs(plane->
pv.
z))
1629 for (i = 0; i < ring->
npoints - 1; i++)
1637 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1639 || ((v1.
z > p->
z) && (v2.
z <= p->
z)))
1642 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1645 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1656 for (i = 0; i < ring->
npoints - 1; i++)
1664 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1666 || ((v1.
z > p->
z) && (v2.
z <= p->
z)))
1669 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1672 if (p->
y < v1.
y + vt * (v2.
y - v1.
y))
1681 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(), lw_dist3d_pt_tri(), lw_dist3d_ptarray_poly(), and lw_dist3d_ptarray_tri().