PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ lw_dist3d_ptarray_poly()

int lw_dist3d_ptarray_poly ( POINTARRAY pa,
LWPOLY poly,
PLANE3D plane,
DISTPTS3D dl 
)

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 {
1032 
1033 
1034  int i,j,k;
1035  double f, s1, s2;
1036  VECTOR3D projp1_projp2;
1037  POINT3DZ p1, p2,projp1, projp2, intersectionp;
1038 
1039  getPoint3dz_p(pa, 0, &p1);
1040 
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);
1043 
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);
1050 
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);
1057 
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;
1062 
1063  intersects = LW_TRUE; /*We set intersects to true until the opposite is proved*/
1064 
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;
1082 
1083  dl->p2.x=intersectionp.x;
1084  dl->p2.y=intersectionp.y;
1085  dl->p2.z=intersectionp.z;
1086  return LW_TRUE;
1087 
1088  }
1089  }
1090  }
1091 
1092  projp1=projp2;
1093  s1=s2;
1094  p1=p2;
1095  }
1096 
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  }
1102 
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
POINT3DZ p2
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
POINT3DZ p1
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
POINTARRAY ** rings
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: