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

◆ ptarray_simplify_in_place_tolerance0()

static void ptarray_simplify_in_place_tolerance0 ( POINTARRAY pa)
static

Definition at line 1798 of file ptarray.c.

1799{
1800 uint32_t kept_it = 0;
1801 uint32_t last_it = pa->npoints - 1;
1802 const POINT2D *kept_pt = getPoint2d_cp(pa, 0);
1803 const size_t pt_size = ptarray_point_size(pa);
1804
1805 for (uint32_t i = 1; i < last_it; i++)
1806 {
1807 const POINT2D *curr_pt = getPoint2d_cp(pa, i);
1808 const POINT2D *next_pt = getPoint2d_cp(pa, i + 1);
1809
1810 double ba_x = next_pt->x - kept_pt->x;
1811 double ba_y = next_pt->y - kept_pt->y;
1812 double ab_length_sqr = ba_x * ba_x + ba_y * ba_y;
1813
1814 double ca_x = curr_pt->x - kept_pt->x;
1815 double ca_y = curr_pt->y - kept_pt->y;
1816 double dot_ac_ab = ca_x * ba_x + ca_y * ba_y;
1817 double s_numerator = ca_x * ba_y - ca_y * ba_x;
1818
1819 if (p2d_same(kept_pt, next_pt) ||
1820 dot_ac_ab < 0.0 ||
1821 dot_ac_ab > ab_length_sqr ||
1822 s_numerator != 0)
1823
1824 {
1825 kept_it++;
1826 kept_pt = curr_pt;
1827 if (kept_it != i)
1828 memcpy(pa->serialized_pointlist + pt_size * kept_it,
1829 pa->serialized_pointlist + pt_size * i,
1830 pt_size);
1831 }
1832 }
1833
1834 /* Append last point */
1835 kept_it++;
1836 if (kept_it != last_it)
1837 memcpy(pa->serialized_pointlist + pt_size * kept_it,
1838 pa->serialized_pointlist + pt_size * last_it,
1839 pt_size);
1840 pa->npoints = kept_it + 1;
1841}
int p2d_same(const POINT2D *p1, const POINT2D *p2)
Definition lwalgorithm.c:57
static size_t ptarray_point_size(const POINTARRAY *pa)
Definition lwinline.h:56
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:97
double y
Definition liblwgeom.h:390
double x
Definition liblwgeom.h:390
uint32_t npoints
Definition liblwgeom.h:427
uint8_t * serialized_pointlist
Definition liblwgeom.h:434

References getPoint2d_cp(), POINTARRAY::npoints, p2d_same(), ptarray_point_size(), POINTARRAY::serialized_pointlist, POINT2D::x, and POINT2D::y.

Referenced by ptarray_simplify_in_place().

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