PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ lw_dist2d_ptarray_ptarrayarc()

int lw_dist2d_ptarray_ptarrayarc ( const POINTARRAY pa,
const POINTARRAY pb,
DISTPTS dl 
)

Test each segment of pa against each arc of pb for distance.

Definition at line 1169 of file measures.c.

References DIST_MAX, DIST_MIN, DISTPTS::distance, getPoint2d_cp(), lw_dist2d_seg_arc(), LW_FALSE, LW_TRUE, LWDEBUGF, lwerror(), DISTPTS::mode, POINTARRAY::npoints, DISTPTS::tolerance, and DISTPTS::twisted.

Referenced by lw_dist2d_line_circstring(), and test_lw_dist2d_ptarray_ptarrayarc().

1170 {
1171  int t, u;
1172  const POINT2D *A1;
1173  const POINT2D *A2;
1174  const POINT2D *B1;
1175  const POINT2D *B2;
1176  const POINT2D *B3;
1177  int twist = dl->twisted;
1178 
1179  LWDEBUGF(2, "lw_dist2d_ptarray_ptarrayarc called (points: %d-%d)",pa->npoints, pb->npoints);
1180 
1181  if ( pb->npoints % 2 == 0 || pb->npoints < 3 )
1182  {
1183  lwerror("lw_dist2d_ptarray_ptarrayarc called with non-arc input");
1184  return LW_FALSE;
1185  }
1186 
1187  if ( dl->mode == DIST_MAX )
1188  {
1189  lwerror("lw_dist2d_ptarray_ptarrayarc does not currently support DIST_MAX mode");
1190  return LW_FALSE;
1191  }
1192  else
1193  {
1194  A1 = getPoint2d_cp(pa, 0);
1195  for ( t=1; t < pa->npoints; t++ ) /* For each segment in pa */
1196  {
1197  A2 = getPoint2d_cp(pa, t);
1198  B1 = getPoint2d_cp(pb, 0);
1199  for ( u=1; u < pb->npoints; u += 2 ) /* For each arc in pb */
1200  {
1201  B2 = getPoint2d_cp(pb, u);
1202  B3 = getPoint2d_cp(pb, u+1);
1203  dl->twisted = twist;
1204 
1205  lw_dist2d_seg_arc(A1, A2, B1, B2, B3, dl);
1206 
1207  /* If we've found a distance within tolerance, we're done */
1208  if ( dl->distance <= dl->tolerance && dl->mode == DIST_MIN )
1209  return LW_TRUE;
1210 
1211  B1 = B3;
1212  }
1213  A1 = A2;
1214  }
1215  }
1216  return LW_TRUE;
1217 }
int npoints
Definition: liblwgeom.h:355
int mode
Definition: measures.h:27
double tolerance
Definition: measures.h:29
#define DIST_MIN
Definition: measures.h:17
#define LW_FALSE
Definition: liblwgeom.h:62
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, int n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:472
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:61
int twisted
Definition: measures.h:28
double distance
Definition: measures.h:24
#define DIST_MAX
Definition: measures.h:16
int lw_dist2d_seg_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl)
Calculate the shortest distance between an arc and an edge.
Definition: measures.c:1274
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:55
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:74
Here is the call graph for this function:
Here is the caller graph for this function: