PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ lw_dist2d_ptarray_ptarray()

int lw_dist2d_ptarray_ptarray ( POINTARRAY l1,
POINTARRAY l2,
DISTPTS dl 
)

test each segment of l1 against each segment of l2.

Definition at line 1208 of file measures.c.

1209 {
1210  uint32_t t, u;
1211  const POINT2D *start, *end;
1212  const POINT2D *start2, *end2;
1213  int twist = dl->twisted;
1214 
1215  LWDEBUGF(2, "lw_dist2d_ptarray_ptarray called (points: %d-%d)", l1->npoints, l2->npoints);
1216 
1217  /* If we are searching for maxdistance we go straight to point-point calculation since the maxdistance have
1218  * to be between two vertexes*/
1219  if (dl->mode == DIST_MAX)
1220  {
1221  for (t = 0; t < l1->npoints; t++) /*for each segment in L1 */
1222  {
1223  start = getPoint2d_cp(l1, t);
1224  for (u = 0; u < l2->npoints; u++) /*for each segment in L2 */
1225  {
1226  start2 = getPoint2d_cp(l2, u);
1227  lw_dist2d_pt_pt(start, start2, dl);
1228  }
1229  }
1230  }
1231  else
1232  {
1233  start = getPoint2d_cp(l1, 0);
1234  for (t = 1; t < l1->npoints; t++) /*for each segment in L1 */
1235  {
1236  end = getPoint2d_cp(l1, t);
1237  start2 = getPoint2d_cp(l2, 0);
1238  for (u = 1; u < l2->npoints; u++) /*for each segment in L2 */
1239  {
1240  end2 = getPoint2d_cp(l2, u);
1241  dl->twisted = twist;
1242  lw_dist2d_seg_seg(start, end, start2, end2, dl);
1243  if (dl->distance <= dl->tolerance && dl->mode == DIST_MIN)
1244  return LW_TRUE; /*just a check if the answer is already given*/
1245  start2 = end2;
1246  }
1247  start = end;
1248  }
1249  }
1250  return LW_TRUE;
1251 }
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:107
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
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_seg_seg(const POINT2D *A, const POINT2D *B, const POINT2D *C, const POINT2D *D, DISTPTS *dl)
Finds the shortest distance between two segments.
Definition: measures.c:1916
int lw_dist2d_pt_pt(const POINT2D *thep1, const POINT2D *thep2, DISTPTS *dl)
Compares incoming points and stores the points closest to each other or most far away from each other...
Definition: measures.c:2365
#define DIST_MIN
Definition: measures.h:44
#define DIST_MAX
Definition: measures.h:43
int twisted
Definition: measures.h:55
double tolerance
Definition: measures.h:56
int mode
Definition: measures.h:54
double distance
Definition: measures.h:51
uint32_t npoints
Definition: liblwgeom.h:413

References DIST_MAX, DIST_MIN, DISTPTS::distance, getPoint2d_cp(), lw_dist2d_pt_pt(), lw_dist2d_seg_seg(), LW_TRUE, LWDEBUGF, DISTPTS::mode, POINTARRAY::npoints, DISTPTS::tolerance, and DISTPTS::twisted.

Referenced by lw_dist2d_line_line(), lw_dist2d_line_poly(), lw_dist2d_line_tri(), lw_dist2d_poly_poly(), lw_dist2d_tri_poly(), and lw_dist2d_tri_tri().

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