1461{
1462 uint32_t i;
1463 double tolsq = tolerance * tolerance;
1466 uint32_t n_points = pa->
npoints;
1467 uint32_t n_points_out = 1;
1469
1470 double dsq = FLT_MAX;
1471
1472
1473 if ( n_points <= min_points ) return;
1474
1476 void *p_to = ((char *)last) + pt_size;
1477 for (i = 1; i < n_points; i++)
1478 {
1479 int last_point = (i == n_points - 1);
1480
1481
1483
1484
1485 if (n_points + n_points_out > min_points + i)
1486 {
1487 if (tolerance > 0.0)
1488 {
1489
1491
1492 if (!last_point && dsq <= tolsq)
1493 {
1494 continue;
1495 }
1496 }
1497 else
1498 {
1499
1500 if (memcmp((char*)pt, (char*)last, pt_size) == 0)
1501 continue;
1502 }
1503
1504
1505
1506
1507
1508 if (last_point && n_points_out > 1 && tolerance > 0.0 && dsq <= tolsq)
1509 {
1510 n_points_out--;
1511 p_to -= pt_size;
1512 }
1513 }
1514
1515
1516 memcpy(p_to, pt, pt_size);
1517 n_points_out++;
1518 p_to += pt_size;
1519 last = pt;
1520 }
1521
1523 return;
1524}
static double distance2d_sqr_pt_pt(const POINT2D *p1, const POINT2D *p2)
static size_t ptarray_point_size(const POINTARRAY *pa)
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.