PostGIS 3.7.0dev-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 968 of file measures.c.

969{
970 const POINT2D *pt;
971
972 LWDEBUG(2, "lw_dist2d_poly_poly called");
973
974 /*1 if we are looking for maxdistance, just check the outer rings.*/
975 if (dl->mode == DIST_MAX)
976 return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
977
978 /* 2 check if poly1 has first point outside poly2 and vice versa, if so, just check outer rings
979 here it would be possible to handle the information about which one is inside which one and only search for the
980 smaller ones in the bigger ones holes.*/
981 pt = getPoint2d_cp(poly1->rings[0], 0);
982 if (ptarray_contains_point(poly2->rings[0], pt) == LW_OUTSIDE)
983 {
984 pt = getPoint2d_cp(poly2->rings[0], 0);
985 if (ptarray_contains_point(poly1->rings[0], pt) == LW_OUTSIDE)
986 return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[0], dl);
987 }
988
989 /*3 check if first point of poly2 is in a hole of poly1. If so check outer ring of poly2 against that hole
990 * of poly1*/
991 pt = getPoint2d_cp(poly2->rings[0], 0);
992 for (uint32_t i = 1; i < poly1->nrings; i++)
993 if (ptarray_contains_point(poly1->rings[i], pt) != LW_OUTSIDE)
994 return lw_dist2d_ptarray_ptarray(poly1->rings[i], poly2->rings[0], dl);
995
996 /*4 check if first point of poly1 is in a hole of poly2. If so check outer ring of poly1 against that hole
997 * of poly2*/
998 pt = getPoint2d_cp(poly1->rings[0], 0);
999 for (uint32_t i = 1; i < poly2->nrings; i++)
1000 if (ptarray_contains_point(poly2->rings[i], pt) != LW_OUTSIDE)
1001 return lw_dist2d_ptarray_ptarray(poly1->rings[0], poly2->rings[i], dl);
1002
1003 /*5 If we have come all the way here we know that the first point of one of them is inside the other ones
1004 * outer ring and not in holes so we check which one is inside.*/
1005 pt = getPoint2d_cp(poly1->rings[0], 0);
1006 if (ptarray_contains_point(poly2->rings[0], pt) != LW_OUTSIDE)
1007 {
1008 lw_dist2d_distpts_set(dl, 0.0, pt, pt);
1009 return LW_TRUE;
1010 }
1011
1012 pt = getPoint2d_cp(poly2->rings[0], 0);
1013 if (ptarray_contains_point(poly1->rings[0], pt) != LW_OUTSIDE)
1014 {
1015 lw_dist2d_distpts_set(dl, 0.0, pt, pt);
1016 return LW_TRUE;
1017 }
1018
1019 lwerror("Unspecified error in function lw_dist2d_poly_poly");
1020 return LW_FALSE;
1021}
#define LW_FALSE
Definition liblwgeom.h:94
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:93
int ptarray_contains_point(const POINTARRAY *pa, const POINT2D *pt)
The following is based on the "Fast Winding Number Inclusion of a Point in a Polygon" algorithm by Da...
Definition ptarray.c:755
#define LW_OUTSIDE
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
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:97
static void lw_dist2d_distpts_set(DISTPTS *dl, double distance, const POINT2D *p1, const POINT2D *p2)
Definition measures.c:81
int lw_dist2d_ptarray_ptarray(POINTARRAY *l1, POINTARRAY *l2, DISTPTS *dl)
test each segment of l1 against each segment of l2.
Definition measures.c:1197
#define DIST_MAX
Definition measures.h:43
int mode
Definition measures.h:54
POINTARRAY ** rings
Definition liblwgeom.h:519
uint32_t nrings
Definition liblwgeom.h:524

References DIST_MAX, getPoint2d_cp(), lw_dist2d_distpts_set(), lw_dist2d_ptarray_ptarray(), LW_FALSE, LW_OUTSIDE, LW_TRUE, LWDEBUG, lwerror(), DISTPTS::mode, LWPOLY::nrings, ptarray_contains_point(), and LWPOLY::rings.

Referenced by lw_dist2d_distribute_bruteforce().

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