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

◆ 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 1257 of file measures.c.

1258{
1259 uint32_t t, u;
1260 const POINT2D *A1;
1261 const POINT2D *A2;
1262 const POINT2D *B1;
1263 const POINT2D *B2;
1264 const POINT2D *B3;
1265 int twist = dl->twisted;
1266
1267 LWDEBUGF(2, "lw_dist2d_ptarray_ptarrayarc called (points: %d-%d)", pa->npoints, pb->npoints);
1268
1269 if (pb->npoints % 2 == 0 || pb->npoints < 3)
1270 {
1271 lwerror("lw_dist2d_ptarray_ptarrayarc called with non-arc input");
1272 return LW_FALSE;
1273 }
1274
1275 if (dl->mode == DIST_MAX)
1276 {
1277 lwerror("lw_dist2d_ptarray_ptarrayarc does not currently support DIST_MAX mode");
1278 return LW_FALSE;
1279 }
1280 else
1281 {
1282 A1 = getPoint2d_cp(pa, 0);
1283 for (t = 1; t < pa->npoints; t++) /* For each segment in pa */
1284 {
1285 A2 = getPoint2d_cp(pa, t);
1286 B1 = getPoint2d_cp(pb, 0);
1287 for (u = 1; u < pb->npoints; u += 2) /* For each arc in pb */
1288 {
1289 B2 = getPoint2d_cp(pb, u);
1290 B3 = getPoint2d_cp(pb, u + 1);
1291 dl->twisted = twist;
1292
1293 lw_dist2d_seg_arc(A1, A2, B1, B2, B3, dl);
1294
1295 /* If we've found a distance within tolerance, we're done */
1296 if (dl->distance <= dl->tolerance && dl->mode == DIST_MIN)
1297 return LW_TRUE;
1298
1299 B1 = B3;
1300 }
1301 A1 = A2;
1302 }
1303 }
1304 return LW_TRUE;
1305}
#define LW_FALSE
Definition liblwgeom.h:108
#define LW_TRUE
Return types for functions with status returns.
Definition liblwgeom.h:107
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:88
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_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:1362
#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_seg_arc(), LW_FALSE, LW_TRUE, LWDEBUGF, lwerror(), DISTPTS::mode, POINTARRAY::npoints, DISTPTS::tolerance, and DISTPTS::twisted.

Referenced by lw_dist2d_line_circstring(), lw_dist2d_tri_circstring(), and test_lw_dist2d_ptarray_ptarrayarc().

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