PostGIS  2.5.1dev-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 1135 of file measures.c.

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(), and lw_dist2d_poly_poly().

1136 {
1137  uint32_t t,u;
1138  const POINT2D *start, *end;
1139  const POINT2D *start2, *end2;
1140  int twist = dl->twisted;
1141 
1142  LWDEBUGF(2, "lw_dist2d_ptarray_ptarray called (points: %d-%d)",l1->npoints, l2->npoints);
1143 
1144  if (dl->mode == DIST_MAX)/*If we are searching for maxdistance we go straight to point-point calculation since the maxdistance have to be between two vertexes*/
1145  {
1146  for (t=0; t<l1->npoints; t++) /*for each segment in L1 */
1147  {
1148  start = getPoint2d_cp(l1, t);
1149  for (u=0; u<l2->npoints; u++) /*for each segment in L2 */
1150  {
1151  start2 = getPoint2d_cp(l2, u);
1152  lw_dist2d_pt_pt(start, start2, dl);
1153  LWDEBUGF(4, "maxdist_ptarray_ptarray; seg %i * seg %i, dist = %g\n",t,u,dl->distance);
1154  LWDEBUGF(3, " seg%d-seg%d dist: %f, mindist: %f",
1155  t, u, dl->distance, dl->tolerance);
1156  }
1157  }
1158  }
1159  else
1160  {
1161  start = getPoint2d_cp(l1, 0);
1162  for (t=1; t<l1->npoints; t++) /*for each segment in L1 */
1163  {
1164  end = getPoint2d_cp(l1, t);
1165  start2 = getPoint2d_cp(l2, 0);
1166  for (u=1; u<l2->npoints; u++) /*for each segment in L2 */
1167  {
1168  end2 = getPoint2d_cp(l2, u);
1169  dl->twisted=twist;
1170  lw_dist2d_seg_seg(start, end, start2, end2, dl);
1171  LWDEBUGF(4, "mindist_ptarray_ptarray; seg %i * seg %i, dist = %g\n",t,u,dl->distance);
1172  LWDEBUGF(3, " seg%d-seg%d dist: %f, mindist: %f",
1173  t, u, dl->distance, dl->tolerance);
1174  if (dl->distance<=dl->tolerance && dl->mode == DIST_MIN) return LW_TRUE; /*just a check if the answer is already given*/
1175  start2 = end2;
1176  }
1177  start = end;
1178  }
1179  }
1180  return LW_TRUE;
1181 }
int mode
Definition: measures.h:51
unsigned int uint32_t
Definition: uthash.h:78
double tolerance
Definition: measures.h:53
#define DIST_MIN
Definition: measures.h:41
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
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:1820
int twisted
Definition: measures.h:52
double distance
Definition: measures.h:48
#define DIST_MAX
Definition: measures.h:40
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
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:2281
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:364
uint32_t npoints
Definition: liblwgeom.h:373
Here is the call graph for this function:
Here is the caller graph for this function: