1675{
1676 uint32_t i;
1677 double tolsq = tolerance * tolerance;
1680 uint32_t n_points = pa->
npoints;
1681 uint32_t n_points_out = 1;
1683
1684 double dsq = FLT_MAX;
1685
1686
1687 if ( n_points <= min_points ) return;
1688
1690 void *p_to = ((char *)last) + pt_size;
1691 for (i = 1; i < n_points; i++)
1692 {
1693 int last_point = (i == n_points - 1);
1694
1695
1697
1698
1699 if (n_points + n_points_out > min_points + i)
1700 {
1701 if (tolerance > 0.0)
1702 {
1703
1705
1706 if (!last_point && dsq <= tolsq)
1707 {
1708 continue;
1709 }
1710 }
1711 else
1712 {
1713
1714 if (memcmp((char*)pt, (char*)last, pt_size) == 0)
1715 continue;
1716 }
1717
1718
1719
1720
1721
1722 if (last_point && n_points_out > 1 && tolerance > 0.0 && dsq <= tolsq)
1723 {
1724 n_points_out--;
1725 p_to = (char*)p_to - pt_size;
1726 }
1727 }
1728
1729
1730 memcpy(p_to, pt, pt_size);
1731 n_points_out++;
1732 p_to = (char*)p_to + pt_size;
1733 last = pt;
1734 }
1735
1737 return;
1738}
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.