PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lw_dist3d_poly_poly()

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

polygon to polygon calculation

Definition at line 691 of file measures3d.c.

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().

692 {
693  PLANE3D plane1, plane2;
694  int planedef1, planedef2;
695  LWDEBUG(2, "lw_dist3d_poly_poly is called");
696  if (dl->mode == DIST_MAX)
697  {
698  return lw_dist3d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
699  }
700 
701  planedef1 = define_plane(poly1->rings[0], &plane1);
702  planedef2 = define_plane(poly2->rings[0], &plane2);
703 
704  if (!planedef1 || !planedef2)
705  {
706  if (!planedef1 && !planedef2)
707  {
708  /* Neither polygon define a plane: Return distance line to line */
709  return lw_dist3d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
710  }
711 
712  if (!planedef1)
713  {
714  /* Only poly2 defines a plane: Return distance from line (poly1) to poly2 */
715  return lw_dist3d_ptarray_poly(poly1->rings[0], poly2, &plane2, dl);
716  }
717 
718  /* Only poly1 defines a plane: Return distance from line (poly2) to poly1 */
719  return lw_dist3d_ptarray_poly(poly2->rings[0], poly1, &plane1, dl);
720  }
721 
722  /*What we do here is to compare the boundary of one polygon with the other polygon
723  and then take the second boundary comparing with the first polygon*/
724  dl->twisted=1;
725  if (!lw_dist3d_ptarray_poly(poly1->rings[0], poly2, &plane2, dl))
726  return LW_FALSE;
727  if (dl->distance < dl->tolerance) /*Just check if the answer already is given*/
728  return LW_TRUE;
729 
730  dl->twisted=-1; /*because we switch the order of geometries we switch "twisted" to -1 which will give the right order of points in shortest line.*/
731  return lw_dist3d_ptarray_poly(poly2->rings[0], poly1, &plane1, dl);
732 }
double distance
Definition: measures3d.h:41
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
#define LW_FALSE
Definition: liblwgeom.h:77
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
int twisted
Definition: measures3d.h:45
POINTARRAY ** rings
Definition: liblwgeom.h:457
int mode
Definition: measures3d.h:44
int define_plane(POINTARRAY *pa, PLANE3D *pl)
Definition: measures3d.c:1173
double tolerance
Definition: measures3d.h:46
#define DIST_MAX
Definition: measures.h:43
int lw_dist3d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS3D *dl)
Finds all combinationes of segments between two pointarrays.
Definition: measures3d.c:867
int lw_dist3d_ptarray_poly(POINTARRAY *pa, LWPOLY *poly, PLANE3D *plane, DISTPTS3D *dl)
Computes pointarray to polygon distance.
Definition: measures3d.c:1077
Here is the call graph for this function:
Here is the caller graph for this function: