PostGIS  2.3.8dev-r@@SVN_REVISION@@

◆ lw_dist3d_ptarray_poly()

int lw_dist3d_ptarray_poly ( POINTARRAY pa,
LWPOLY poly,
PLANE3D plane,

Computes pointarray to polygon distance.

Definition at line 1054 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().

1055 {
1058  int i,j,k;
1059  double f, s1, s2;
1060  VECTOR3D projp1_projp2;
1061  POINT3DZ p1, p2,projp1, projp2, intersectionp;
1063  getPoint3dz_p(pa, 0, &p1);
1065  s1=project_point_on_plane(&p1, plane, &projp1); /*the sign of s1 tells us on which side of the plane the point is. */
1066  lw_dist3d_pt_poly(&p1, poly, plane,&projp1, dl);
1068  for (i=1;i<pa->npoints;i++)
1069  {
1070  int intersects;
1071  getPoint3dz_p(pa, i, &p2);
1072  s2=project_point_on_plane(&p2, plane, &projp2);
1073  lw_dist3d_pt_poly(&p2, poly, plane,&projp2, dl);
1075  /*If s1and s2 has different signs that means they are on different sides of the plane of the polygon.
1076  That means that the edge between the points crosses the plane and might intersect with the polygon*/
1077  if((s1*s2)<=0)
1078  {
1079  f=fabs(s1)/(fabs(s1)+fabs(s2)); /*The size of s1 and s2 is the distance from the point to the plane.*/
1080  get_3dvector_from_points(&projp1, &projp2,&projp1_projp2);
1082  /*get the point where the line segment crosses the plane*/
1083  intersectionp.x=projp1.x+f*projp1_projp2.x;
1084  intersectionp.y=projp1.y+f*projp1_projp2.y;
1085  intersectionp.z=projp1.z+f*projp1_projp2.z;
1087  intersects = LW_TRUE; /*We set intersects to true until the opposite is proved*/
1089  if(pt_in_ring_3d(&intersectionp, poly->rings[0], plane)) /*Inside outer ring*/
1090  {
1091  for (k=1;k<poly->nrings; k++)
1092  {
1093  /* Inside a hole, so no intersection with the polygon*/
1094  if ( pt_in_ring_3d(&intersectionp, poly->rings[k], plane ))
1095  {
1096  intersects=LW_FALSE;
1097  break;
1098  }
1099  }
1100  if(intersects)
1101  {
1102  dl->distance=0.0;
1103  dl->p1.x=intersectionp.x;
1104  dl->p1.y=intersectionp.y;
1105  dl->p1.z=intersectionp.z;
1107  dl->p2.x=intersectionp.x;
1108  dl->p2.y=intersectionp.y;
1109  dl->p2.z=intersectionp.z;
1110  return LW_TRUE;
1112  }
1113  }
1114  }
1116  projp1=projp2;
1117  s1=s2;
1118  p1=p2;
1119  }
1121  /*check or pointarray against boundary and inner boundaries of the polygon*/
1122  for (j=0;j<poly->nrings;j++)
1123  {
1124  lw_dist3d_ptarray_ptarray(pa, poly->rings[j], dl);
1125  }
1127 return LW_TRUE;
1128 }
double z
Definition: liblwgeom.h:333
double y
Definition: liblwgeom.h:333
double distance
Definition: measures3d.h:41
double x
Definition: liblwgeom.h:333
double z
Definition: measures3d.h:51
Definition: measures3d.h:43
int npoints
Definition: liblwgeom.h:370
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:1203
Definition: measures3d.h:42
double y
Definition: measures3d.h:51
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:1020
int getPoint3dz_p(const POINTARRAY *pa, int n, POINT3DZ *point)
Definition: lwgeom_api.c:332
#define LW_FALSE
Definition: liblwgeom.h:76
Datum intersects(PG_FUNCTION_ARGS)
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
Definition: liblwgeom.h:456
static int get_3dvector_from_points(POINT3DZ *p1, POINT3DZ *p2, VECTOR3D *v)
Definition: measures3d.c:45
int nrings
Definition: liblwgeom.h:454
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:1241
double x
Definition: measures3d.h:51
int lw_dist3d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS3D *dl)
Finds all combinationes of segments between two pointarrays.
Definition: measures3d.c:844
Here is the call graph for this function:
Here is the caller graph for this function: