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

◆ lw_dist2d_poly_poly()

int lw_dist2d_poly_poly ( LWPOLY poly1,
LWPOLY poly2,
DISTPTS dl 
)

Function handling polygon to polygon calculation 1 if we are looking for maxdistance, just check the outer rings.

2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings 3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole of poly1 4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole of poly2 5 If we have come all the way here we know that the first point of one of them is inside the other ones outer ring and not in holes so we check which one is inside.

Definition at line 977 of file measures.c.

978{
979 const POINT2D *pt;
980
981 LWDEBUG(2, "lw_dist2d_poly_poly called");
982
983 /*1 if we are looking for maxdistance, just check the outer rings.*/
984 if (dl->mode == DIST_MAX)
985 return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
986
987 /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
988 here it would be possible to handle the information about which one is inside which one and only search for the
989 smaller ones in the bigger ones holes.*/
990 pt = getPoint2d_cp(poly1->rings[0], 0);
991 if (ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE)
992 {
993 pt = getPoint2d_cp(poly2->rings[0], 0);
994 if (ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE)
995 return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
996 }
997
998 /*3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole
999 * of poly1*/
1000 pt = getPoint2d_cp(poly2->rings[0], 0);
1001 for (uint32_t i = 1; i < poly1->nrings; i++)
1002 if (ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE)
1003 return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
1004
1005 /*4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole
1006 * of poly2*/
1007 pt = getPoint2d_cp(poly1->rings[0], 0);
1008 for (uint32_t i = 1; i < poly2->nrings; i++)
1009 if (ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE)
1010 return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
1011
1012 /*5 If we have come all the way here we know that the first point of one of them is inside the other ones
1013 * outer ring and not in holes so we check wich one is inside.*/
1014 pt = getPoint2d_cp(poly1->rings[0], 0);
1015 if (ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE)
1016 {
1017 dl->distance = 0.0;
1018 dl->p1.x = dl->p2.x = pt->x;
1019 dl->p1.y = dl->p2.y = pt->y;
1020 return LW_TRUE;
1021 }
1022
1023 pt = getPoint2d_cp(poly2->rings[0], 0);
1024 if (ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE)
1025 {
1026 dl->distance = 0.0;
1027 dl->p1.x = dl->p2.x = pt->x;
1028 dl->p1.y = dl->p2.y = pt->y;
1029 return LW_TRUE;
1030 }
1031
1032 lwerror("Unspecified error in function lw_dist2d_poly_poly");
1033 return LW_FALSE;
1034}
#define LW_FALSE
Definition liblwgeom.h:108
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
int ptarray_contains_point(const POINTARRAY *pa, const POINT2D *pt)
Return 1 if the point is inside the POINTARRAY, -1 if it is outside, and 0 if it is on the boundary.
Definition ptarray.c:740
#define LW_OUTSIDE
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:83
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition lwutil.c:190
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition lwinline.h:91
int lw_dist2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS *dl)
test each segment of l1 against each segment of l2.
Definition measures.c:1208
#define DIST_MAX
Definition measures.h:43
POINT2D p1
Definition measures.h:52
POINT2D p2
Definition measures.h:53
int mode
Definition measures.h:54
double distance
Definition measures.h:51
POINTARRAY ** rings
Definition liblwgeom.h:505
uint32_t nrings
Definition liblwgeom.h:510
double y
Definition liblwgeom.h:376
double x
Definition liblwgeom.h:376

References DIST_MAX, DISTPTS::distance, getPoint2d_cp(), lw_dist2d_ptarray_ptarray(), LW_FALSE, LW_OUTSIDE, LW_TRUE, LWDEBUG, lwerror(), DISTPTS::mode, LWPOLY::nrings, DISTPTS::p1, DISTPTS::p2, ptarray_contains_point(), LWPOLY::rings, POINT2D::x, and POINT2D::y.

Referenced by lw_dist2d_distribute_bruteforce().

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