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

◆ lw_dist3d_poly_poly()

int lw_dist3d_poly_poly ( const LWPOLY poly1,
const LWPOLY poly2,
DISTPTS3D dl 
)

polygon to polygon calculation

Definition at line 870 of file measures3d.c.

871{
872 PLANE3D plane1, plane2;
873 int planedef1, planedef2;
874 LWDEBUG(2, "lw_dist3d_poly_poly is called");
875 if (dl->mode == DIST_MAX)
876 return lw_dist3d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
877
878 planedef1 = define_plane(poly1->rings[0], &plane1);
879 planedef2 = define_plane(poly2->rings[0], &plane2);
880
881 if (!planedef1 || !planedef2)
882 {
883 /* Neither polygon define a plane: Return distance line to line */
884 if (!planedef1 && !planedef2)
885 return lw_dist3d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
886
887 /* Only poly2 defines a plane: Return distance from line (poly1) to poly2 */
888 else if (!planedef1)
889 return lw_dist3d_ptarray_poly(poly1->rings[0], poly2, &plane2, dl);
890
891 /* Only poly1 defines a plane: Return distance from line (poly2) to poly1 */
892 else
893 return lw_dist3d_ptarray_poly(poly2->rings[0], poly1, &plane1, dl);
894 }
895
896 /* What we do here is to compare the boundary of one polygon with the other polygon
897 and then take the second boundary comparing with the first polygon */
898 dl->twisted = 1;
899 if (!lw_dist3d_ptarray_poly(poly1->rings[0], poly2, &plane2, dl))
900 return LW_FALSE;
901 if (dl->distance < dl->tolerance) /* Just check if the answer already is given*/
902 return LW_TRUE;
903
904 dl->twisted = -1; /* because we switch the order of geometries we switch "twisted" to -1 which will give the
905 right order of points in shortest line. */
906 return lw_dist3d_ptarray_poly(poly2->rings[0], poly1, &plane1, dl);
907}
#define LW_FALSE
Definition liblwgeom.h:94
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
int lw_dist3d_ptarray_ptarray(const POINTARRAY *l1, const POINTARRAY *l2, DISTPTS3D *dl)
Finds all combinations of segments between two pointarrays.
int define_plane(const POINTARRAY *pa, PLANE3D *pl)
int lw_dist3d_ptarray_poly(const POINTARRAY *pa, const LWPOLY *poly, PLANE3D *plane, DISTPTS3D *dl)
Computes pointarray to polygon distance.
#define DIST_MAX
Definition measures.h:43
int twisted
Definition measures3d.h:45
double distance
Definition measures3d.h:40
double tolerance
Definition measures3d.h:47
POINTARRAY ** rings
Definition liblwgeom.h:519

References define_plane(), DIST_MAX, DISTPTS3D::distance, lw_dist3d_ptarray_poly(), lw_dist3d_ptarray_ptarray(), LW_FALSE, LW_TRUE, LWDEBUG, DISTPTS3D::mode, LWPOLY::rings, DISTPTS3D::tolerance, and DISTPTS3D::twisted.

Referenced by lw_dist3d_distribute_bruteforce().

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