1312{
1313 double mindist=DBL_MAX;
1314 double tlen, plen;
1315 uint32_t t, seg=0;
1316 POINT4D start4d, end4d, projtmp;
1318 const POINT2D *start = NULL, *end = NULL;
1319
1320
1323
1324 if ( ! proj4d ) proj4d = &projtmp;
1325
1326
1328 {
1330 {
1332 if ( mindistout )
1334 }
1335 return 0.0;
1336 }
1337
1339
1341 {
1342 double dist_sqr;
1345
1346 if (dist_sqr < mindist)
1347 {
1348 mindist = dist_sqr;
1349 seg=t-1;
1350 if ( mindist == 0 )
1351 {
1352 LWDEBUG(3,
"Breaking on mindist=0");
1353 break;
1354 }
1355 }
1356
1357 start = end;
1358 }
1359 mindist = sqrt(mindist);
1360
1361 if ( mindistout ) *mindistout = mindist;
1362
1363 LWDEBUGF(3,
"Closest segment: %d", seg);
1364 LWDEBUGF(3,
"mindist: %g", mindist);
1365
1366
1367
1368
1369
1373
1374
1377
1379
1380
1382 {
1383 return 1.0;
1384 }
1385
1386 LWDEBUGF(3,
"Closest point on segment: %g,%g", proj.
x, proj.
y);
1387
1389
1391
1392
1393
1394 if ( tlen == 0 ) return 0;
1395
1396 plen=0;
1398 for (t=0; t<seg; t++, start=end)
1399 {
1402
1403 LWDEBUGF(4,
"Segment %d made plen %g", t, plen);
1404 }
1405
1407
1408 LWDEBUGF(3,
"plen %g, tlen %g", plen, tlen);
1409
1410 return plen/tlen;
1411}
double distance2d_pt_pt(const POINT2D *p1, const POINT2D *p2)
int getPoint4d_p(const POINTARRAY *pa, uint32_t n, POINT4D *point)
double distance2d_sqr_pt_seg(const POINT2D *p, const POINT2D *A, const POINT2D *B)
int p2d_same(const POINT2D *p1, const POINT2D *p2)
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
void closest_point_on_segment(const POINT4D *p, const POINT4D *A, const POINT4D *B, POINT4D *ret)
double ptarray_length_2d(const POINTARRAY *pts)
Find the 2d length of the given POINTARRAY (even if it's 3d)