PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lw_dist3d_pt_poly()

int lw_dist3d_pt_poly ( POINT3DZ p,
LWPOLY poly,
PLANE3D plane,
POINT3DZ projp,
DISTPTS3D dl 
)

Checking if the point projected on the plane of the polygon actually is inside that polygon.

If so the mindistance is between that projected point and our original point. If not we check from original point to the bounadary. If the projected point is inside a hole of the polygon we check the distance to the boudary of that hole.

Definition at line 1043 of file measures3d.c.

References lw_dist3d_pt_pt(), lw_dist3d_pt_ptarray(), LW_TRUE, LWDEBUG, LWPOLY::nrings, pt_in_ring_3d(), and LWPOLY::rings.

Referenced by lw_dist3d_point_poly(), and lw_dist3d_ptarray_poly().

1044 {
1045  int i;
1046 
1047  LWDEBUG(2, "lw_dist3d_point_poly called");
1048 
1049 
1050  if(pt_in_ring_3d(projp, poly->rings[0], plane))
1051  {
1052  for (i=1; i<poly->nrings; i++)
1053  {
1054  /* Inside a hole. Distance = pt -> ring */
1055  if ( pt_in_ring_3d(projp, poly->rings[i], plane ))
1056  {
1057  LWDEBUG(3, " inside an hole");
1058  return lw_dist3d_pt_ptarray(p, poly->rings[i], dl);
1059  }
1060  }
1061 
1062  return lw_dist3d_pt_pt(p,projp,dl);/* If the projected point is inside the polygon the shortest distance is between that point and the inputed point*/
1063  }
1064  else
1065  {
1066  return lw_dist3d_pt_ptarray(p, poly->rings[0], dl); /*If the projected point is outside the polygon we search for the closest distance against the boundarry instead*/
1067  }
1068 
1069  return LW_TRUE;
1070 
1071 }
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
int lw_dist3d_pt_pt(POINT3DZ *thep1, POINT3DZ *thep2, DISTPTS3D *dl)
Compares incomming points and stores the points closest to each other or most far away from each othe...
Definition: measures3d.c:835
POINTARRAY ** rings
Definition: liblwgeom.h:457
int nrings
Definition: liblwgeom.h:455
int pt_in_ring_3d(const POINT3DZ *p, const POINTARRAY *ring, PLANE3D *plane)
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
Definition: measures3d.c:1283
int lw_dist3d_pt_ptarray(POINT3DZ *p, POINTARRAY *pa, DISTPTS3D *dl)
search all the segments of pointarray to see which one is closest to p Returns distance between point...
Definition: measures3d.c:740
Here is the call graph for this function:
Here is the caller graph for this function: