PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ lw_dist3d_ptarray_poly()

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

Computes pointarray to polygon distance.

Definition at line 1333 of file measures3d.c.

1334{
1335 uint32_t i, j, k;
1336 double f, s1, s2;
1337 VECTOR3D projp1_projp2;
1338 POINT3DZ p1, p2, projp1, projp2, intersectionp;
1339
1340 getPoint3dz_p(pa, 0, &p1);
1341
1342 /* the sign of s1 tells us on which side of the plane the point is. */
1343 s1 = project_point_on_plane(&p1, plane, &projp1);
1344 lw_dist3d_pt_poly(&p1, poly, plane, &projp1, dl);
1345 if ((s1 == 0.0) && (dl->distance < dl->tolerance))
1346 return LW_TRUE;
1347
1348 for (i = 1; i < pa->npoints; i++)
1349 {
1350 int intersects;
1351 getPoint3dz_p(pa, i, &p2);
1352 s2 = project_point_on_plane(&p2, plane, &projp2);
1353 lw_dist3d_pt_poly(&p2, poly, plane, &projp2, dl);
1354 if ((s2 == 0.0) && (dl->distance < dl->tolerance))
1355 return LW_TRUE;
1356
1357 /* If s1 and s2 has different signs that means they are on different sides of the plane of the polygon.
1358 * That means that the edge between the points crosses the plane and might intersect with the polygon */
1359 if ((s1 * s2) < 0)
1360 {
1361 /* The size of s1 and s2 is the distance from the point to the plane. */
1362 f = fabs(s1) / (fabs(s1) + fabs(s2));
1363 get_3dvector_from_points(&projp1, &projp2, &projp1_projp2);
1364
1365 /* Get the point where the line segment crosses the plane */
1366 intersectionp.x = projp1.x + f * projp1_projp2.x;
1367 intersectionp.y = projp1.y + f * projp1_projp2.y;
1368 intersectionp.z = projp1.z + f * projp1_projp2.z;
1369
1370 /* We set intersects to true until the opposite is proved */
1371 intersects = LW_TRUE;
1372
1373 if (pt_in_ring_3d(&intersectionp, poly->rings[0], plane)) /*Inside outer ring*/
1374 {
1375 for (k = 1; k < poly->nrings; k++)
1376 {
1377 /* Inside a hole, so no intersection with the polygon*/
1378 if (pt_in_ring_3d(&intersectionp, poly->rings[k], plane))
1379 {
1380 intersects = LW_FALSE;
1381 break;
1382 }
1383 }
1384 if (intersects)
1385 {
1386 dl->distance = 0.0;
1387 dl->p1.x = intersectionp.x;
1388 dl->p1.y = intersectionp.y;
1389 dl->p1.z = intersectionp.z;
1390
1391 dl->p2.x = intersectionp.x;
1392 dl->p2.y = intersectionp.y;
1393 dl->p2.z = intersectionp.z;
1394 return LW_TRUE;
1395 }
1396 }
1397 }
1398
1399 projp1 = projp2;
1400 s1 = s2;
1401 p1 = p2;
1402 }
1403
1404 /* check our pointarray against boundary and inner boundaries of the polygon */
1405 for (j = 0; j < poly->nrings; j++)
1406 lw_dist3d_ptarray_ptarray(pa, poly->rings[j], dl);
1407
1408 return LW_TRUE;
1409}
#define LW_FALSE
Definition liblwgeom.h:94
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:93
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,...
static int get_3dvector_from_points(const POINT3DZ *p1, const POINT3DZ *p2, VECTOR3D *v)
Definition measures3d.c:34
static double project_point_on_plane(const 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:57
int lw_dist3d_ptarray_ptarray(const POINTARRAY *l1, const POINTARRAY *l2, DISTPTS3D *dl)
Finds all combinations of segments between two pointarrays.
int lw_dist3d_pt_poly(const POINT3DZ *p, const LWPOLY *poly, PLANE3D *plane, POINT3DZ *projp, DISTPTS3D *dl)
Checking if the point projected on the plane of the polygon actually is inside that polygon.
POINT3DZ p2
Definition measures3d.h:42
POINT3DZ p1
Definition measures3d.h:41
double distance
Definition measures3d.h:40
double tolerance
Definition measures3d.h:47
POINTARRAY ** rings
Definition liblwgeom.h:519
uint32_t nrings
Definition liblwgeom.h:524
double z
Definition liblwgeom.h:396
double x
Definition liblwgeom.h:396
double y
Definition liblwgeom.h:396
uint32_t npoints
Definition liblwgeom.h:427
double z
Definition measures3d.h:52
double x
Definition measures3d.h:52
double y
Definition measures3d.h:52

References DISTPTS3D::distance, get_3dvector_from_points(), getPoint3dz_p(), 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(), lw_dist3d_poly_poly(), and lw_dist3d_poly_tri().

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