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 1573 of file measures3d.c.
1574{
1575
1576 uint32_t cn = 0;
1577 uint32_t i;
1579
1581
1584 if (memcmp(&first, &last,
sizeof(
POINT3DZ)))
1585 {
1586 lwerror(
"pt_in_ring_3d: V[n] != V[0] (%g %g %g!= %g %g %g)",
1594 }
1595
1596 LWDEBUGF(2,
"pt_in_ring_3d called with point: %g %g %g", p->
x, p->
y, p->
z);
1597
1598
1599
1601
1602 if (fabs(plane->
pv.
z) >= fabs(plane->
pv.
x) &&
1603 fabs(plane->
pv.
z) >= fabs(plane->
pv.
y))
1604
1605 {
1606 for (i = 0; i < ring->
npoints - 1; i++)
1607 {
1608 double vt;
1610
1611
1612 if (
1613
1614 ((v1.
y <= p->
y) && (v2.
y > p->
y))
1615
1616 || ((v1.
y > p->
y) && (v2.
y <= p->
y)))
1617 {
1618
1619 vt = (double)(p->
y - v1.
y) / (v2.
y - v1.
y);
1620
1621
1622 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1623 {
1624
1625 ++cn;
1626 }
1627 }
1628 v1 = v2;
1629 }
1630 }
1631 else if (fabs(plane->
pv.
y) >= fabs(plane->
pv.
x) &&
1632 fabs(plane->
pv.
y) >= fabs(plane->
pv.
z))
1633
1634 {
1635 for (i = 0; i < ring->
npoints - 1; i++)
1636 {
1637 double vt;
1639
1640
1641 if (
1642
1643 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1644
1645 || ((v1.
z > p->
z) && (v2.
z <= p->
z)))
1646 {
1647
1648 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1649
1650
1651 if (p->
x < v1.
x + vt * (v2.
x - v1.
x))
1652 {
1653
1654 ++cn;
1655 }
1656 }
1657 v1 = v2;
1658 }
1659 }
1660 else
1661 {
1662 for (i = 0; i < ring->
npoints - 1; i++)
1663 {
1664 double vt;
1666
1667
1668 if (
1669
1670 ((v1.
z <= p->
z) && (v2.
z > p->
z))
1671
1672 || ((v1.
z > p->
z) && (v2.
z <= p->
z)))
1673 {
1674
1675 vt = (double)(p->
z - v1.
z) / (v2.
z - v1.
z);
1676
1677
1678 if (p->
y < v1.
y + vt * (v2.
y - v1.
y))
1679 {
1680
1681 ++cn;
1682 }
1683 }
1684 v1 = v2;
1685 }
1686 }
1687 LWDEBUGF(3,
"pt_in_ring_3d returning %d", cn & 1);
1688
1689 return (cn & 1);
1690}
int getPoint3dz_p(const POINTARRAY *pa, uint32_t n, POINT3DZ *point)
#define LWDEBUGF(level, msg,...)
void void lwerror(const char *fmt,...) __attribute__((format(printf
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().