PostGIS  2.5.7dev-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 1074 of file measures3d.c.

1075 {
1076  uint32_t i,j,k;
1077  double f, s1, s2;
1078  VECTOR3D projp1_projp2;
1079  POINT3DZ p1, p2,projp1, projp2, intersectionp;
1080 
1081  getPoint3dz_p(pa, 0, &p1);
1082 
1084  &p1, plane, &projp1); /*the sign of s1 tells us on which side of the plane the point is. */
1085  lw_dist3d_pt_poly(&p1, poly, plane,&projp1, dl);
1086  if ((s1 == 0.0) && (dl->distance < dl->tolerance))
1087  {
1088  return LW_TRUE;
1089  }
1090 
1091  for (i=1;i<pa->npoints;i++)
1092  {
1093  int intersects;
1094  getPoint3dz_p(pa, i, &p2);
1095  s2=project_point_on_plane(&p2, plane, &projp2);
1096  lw_dist3d_pt_poly(&p2, poly, plane,&projp2, dl);
1097  if ((s2 == 0.0) && (dl->distance < dl->tolerance))
1098  {
1099  return LW_TRUE;
1100  }
1101 
1102  /*If s1and s2 has different signs that means they are on different sides of the plane of the polygon.
1103  That means that the edge between the points crosses the plane and might intersect with the polygon*/
1104  if ((s1 * s2) < 0)
1105  {
1106  f=fabs(s1)/(fabs(s1)+fabs(s2)); /*The size of s1 and s2 is the distance from the point to the plane.*/
1107  get_3dvector_from_points(&projp1, &projp2,&projp1_projp2);
1108 
1109  /*get the point where the line segment crosses the plane*/
1110  intersectionp.x=projp1.x+f*projp1_projp2.x;
1111  intersectionp.y=projp1.y+f*projp1_projp2.y;
1112  intersectionp.z=projp1.z+f*projp1_projp2.z;
1113 
1114  intersects = LW_TRUE; /*We set intersects to true until the opposite is proved*/
1115 
1116  if(pt_in_ring_3d(&intersectionp, poly->rings[0], plane)) /*Inside outer ring*/
1117  {
1118  for (k=1;k<poly->nrings; k++)
1119  {
1120  /* Inside a hole, so no intersection with the polygon*/
1121  if ( pt_in_ring_3d(&intersectionp, poly->rings[k], plane ))
1122  {
1124  break;
1125  }
1126  }
1127  if(intersects)
1128  {
1129  dl->distance=0.0;
1130  dl->p1.x=intersectionp.x;
1131  dl->p1.y=intersectionp.y;
1132  dl->p1.z=intersectionp.z;
1133 
1134  dl->p2.x=intersectionp.x;
1135  dl->p2.y=intersectionp.y;
1136  dl->p2.z=intersectionp.z;
1137  return LW_TRUE;
1138 
1139  }
1140  }
1141  }
1142 
1143  projp1=projp2;
1144  s1=s2;
1145  p1=p2;
1146  }
1147 
1148  /*check or pointarray against boundary and inner boundaries of the polygon*/
1149  for (j=0;j<poly->nrings;j++)
1150  {
1151  lw_dist3d_ptarray_ptarray(pa, poly->rings[j], dl);
1152  }
1153 
1154 return LW_TRUE;
1155 }
#define LW_FALSE
Definition: liblwgeom.h:77
int getPoint3dz_p(const POINTARRAY *pa, uint32_t n, POINT3DZ *point)
Definition: lwgeom_api.c:215
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
Datum intersects(PG_FUNCTION_ARGS)
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,...
Definition: measures3d.c:1277
static int get_3dvector_from_points(POINT3DZ *p1, POINT3DZ *p2, VECTOR3D *v)
Definition: measures3d.c:45
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:1040
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:1231
int lw_dist3d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS3D *dl)
Finds all combinations of segments between two pointarrays.
Definition: measures3d.c:864
POINT3DZ p2
Definition: measures3d.h:43
POINT3DZ p1
Definition: measures3d.h:42
double distance
Definition: measures3d.h:41
double tolerance
Definition: measures3d.h:46
POINTARRAY ** rings
Definition: liblwgeom.h:460
uint32_t nrings
Definition: liblwgeom.h:458
double z
Definition: liblwgeom.h:337
double x
Definition: liblwgeom.h:337
double y
Definition: liblwgeom.h:337
uint32_t npoints
Definition: liblwgeom.h:374
double z
Definition: measures3d.h:51
double x
Definition: measures3d.h:51
double y
Definition: measures3d.h:51
unsigned int uint32_t
Definition: uthash.h:78

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, DISTPTS3D::p1, DISTPTS3D::p2, project_point_on_plane(), pt_in_ring_3d(), LWPOLY::rings, DISTPTS3D::tolerance, POINT3DZ::x, VECTOR3D::x, POINT3DZ::y, VECTOR3D::y, POINT3DZ::z, and VECTOR3D::z.

Referenced by lw_dist3d_line_poly(), and lw_dist3d_poly_poly().

Here is the call graph for this function:
Here is the caller graph for this function: