PostGIS  2.2.7dev-r@@SVN_REVISION@@
int lw_dist3d_ptarray_poly ( POINTARRAY pa,
LWPOLY poly,
PLANE3D plane,

Computes pointarray to polygon distance.

Definition at line 1030 of file measures3d.c.

References DISTPTS3D::distance, get_3dvector_from_points(), getPoint3dz_p(), intersects(), lw_dist3d_pt_poly(), lw_dist3d_ptarray_ptarray(), LW_FALSE, LW_TRUE, POINTARRAY::npoints, LWPOLY::nrings, rect_node::p1, DISTPTS3D::p1, rect_node::p2, DISTPTS3D::p2, project_point_on_plane(), pt_in_ring_3d(), LWPOLY::rings, VECTOR3D::x, POINT3DZ::x, VECTOR3D::y, POINT3DZ::y, VECTOR3D::z, and POINT3DZ::z.

Referenced by lw_dist3d_line_poly(), and lw_dist3d_poly_poly().

1031 {
1034  int i,j,k;
1035  double f, s1, s2;
1036  VECTOR3D projp1_projp2;
1037  POINT3DZ p1, p2,projp1, projp2, intersectionp;
1039  getPoint3dz_p(pa, 0, &p1);
1041  s1=project_point_on_plane(&p1, plane, &projp1); /*the sign of s1 tells us on which side of the plane the point is. */
1042  lw_dist3d_pt_poly(&p1, poly, plane,&projp1, dl);
1044  for (i=1;i<pa->npoints;i++)
1045  {
1046  int intersects;
1047  getPoint3dz_p(pa, i, &p2);
1048  s2=project_point_on_plane(&p2, plane, &projp2);
1049  lw_dist3d_pt_poly(&p2, poly, plane,&projp2, dl);
1051  /*If s1and s2 has different signs that means they are on different sides of the plane of the polygon.
1052  That means that the edge between the points crosses the plane and might intersect with the polygon*/
1053  if((s1*s2)<=0)
1054  {
1055  f=fabs(s1)/(fabs(s1)+fabs(s2)); /*The size of s1 and s2 is the distance from the point to the plane.*/
1056  get_3dvector_from_points(&projp1, &projp2,&projp1_projp2);
1058  /*get the point where the line segment crosses the plane*/
1059  intersectionp.x=projp1.x+f*projp1_projp2.x;
1060  intersectionp.y=projp1.y+f*projp1_projp2.y;
1061  intersectionp.z=projp1.z+f*projp1_projp2.z;
1063  intersects = LW_TRUE; /*We set intersects to true until the opposite is proved*/
1065  if(pt_in_ring_3d(&intersectionp, poly->rings[0], plane)) /*Inside outer ring*/
1066  {
1067  for (k=1;k<poly->nrings; k++)
1068  {
1069  /* Inside a hole, so no intersection with the polygon*/
1070  if ( pt_in_ring_3d(&intersectionp, poly->rings[k], plane ))
1071  {
1072  intersects=LW_FALSE;
1073  break;
1074  }
1075  }
1076  if(intersects)
1077  {
1078  dl->distance=0.0;
1079  dl->p1.x=intersectionp.x;
1080  dl->p1.y=intersectionp.y;
1081  dl->p1.z=intersectionp.z;
1083  dl->p2.x=intersectionp.x;
1084  dl->p2.y=intersectionp.y;
1085  dl->p2.z=intersectionp.z;
1086  return LW_TRUE;
1088  }
1089  }
1090  }
1092  projp1=projp2;
1093  s1=s2;
1094  p1=p2;
1095  }
1097  /*check or pointarray against boundary and inner boundaries of the polygon*/
1098  for (j=0;j<poly->nrings;j++)
1099  {
1100  lw_dist3d_ptarray_ptarray(pa, poly->rings[j], dl);
1101  }
1103 return LW_TRUE;
1104 }
double z
Definition: liblwgeom.h:318
double y
Definition: liblwgeom.h:318
double distance
Definition: measures3d.h:27
double x
Definition: liblwgeom.h:318
double z
Definition: measures3d.h:37
Definition: measures3d.h:29
int npoints
Definition: liblwgeom.h:355
double project_point_on_plane(POINT3DZ *p, PLANE3D *pl, POINT3DZ *p0)
Finds a point on a plane from where the original point is perpendicular to the plane.
Definition: measures3d.c:1179
Definition: measures3d.h:28
double y
Definition: measures3d.h:37
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...
Definition: measures3d.c:996
int getPoint3dz_p(const POINTARRAY *pa, int n, POINT3DZ *point)
Definition: lwgeom_api.c:319
#define LW_FALSE
Definition: liblwgeom.h:62
Datum intersects(PG_FUNCTION_ARGS)
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:61
Definition: liblwgeom.h:441
static int get_3dvector_from_points(POINT3DZ *p1, POINT3DZ *p2, VECTOR3D *v)
Definition: measures3d.c:21
int nrings
Definition: liblwgeom.h:439
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:1217
double x
Definition: measures3d.h:37
int lw_dist3d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS3D *dl)
Finds all combinationes of segments between two pointarrays.
Definition: measures3d.c:820

Here is the call graph for this function:

Here is the caller graph for this function: