1519{
1520 double mindist=DBL_MAX;
1521 double tlen, plen;
1522 uint32_t t, seg=0;
1523 POINT4D start4d, end4d, projtmp;
1525 const POINT2D *start = NULL, *end = NULL;
1526
1527
1530
1531 if ( ! proj4d ) proj4d = &projtmp;
1532
1533
1535 {
1537 {
1539 if ( mindistout )
1541 }
1542 return 0.0;
1543 }
1544
1546
1548 {
1549 double dist_sqr;
1552
1553 if (dist_sqr < mindist)
1554 {
1555 mindist = dist_sqr;
1556 seg=t-1;
1557 if ( mindist == 0 )
1558 {
1559 LWDEBUG(3,
"Breaking on mindist=0");
1560 break;
1561 }
1562 }
1563
1564 start = end;
1565 }
1566 mindist = sqrt(mindist);
1567
1568 if ( mindistout ) *mindistout = mindist;
1569
1570 LWDEBUGF(3,
"Closest segment: %d", seg);
1571 LWDEBUGF(3,
"mindist: %g", mindist);
1572
1573
1574
1575
1576
1580
1581
1584
1586
1587
1589 {
1590 return 1.0;
1591 }
1592
1593 LWDEBUGF(3,
"Closest point on segment: %g,%g", proj.
x, proj.
y);
1594
1596
1598
1599
1600
1601 if ( tlen == 0 ) return 0;
1602
1603 plen=0;
1605 for (t=0; t<seg; t++, start=end)
1606 {
1609
1610 LWDEBUGF(4,
"Segment %d made plen %g", t, plen);
1611 }
1612
1614
1615 LWDEBUGF(3,
"plen %g, tlen %g", plen, tlen);
1616
1617
1618 double result = plen / tlen;
1621 }
else if (
result > 1.0 ) {
1623 }
1625}
char result[OUT_DOUBLE_BUFFER_SIZE]
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)