PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ ptarray_remove_repeated_points_in_place()

void ptarray_remove_repeated_points_in_place ( POINTARRAY pa,
double  tolerance,
uint32_t  min_points 
)

Definition at line 1522 of file ptarray.c.

1523 {
1524  uint32_t i;
1525  double tolsq = tolerance * tolerance;
1526  const POINT2D *last = NULL;
1527  const POINT2D *pt;
1528  uint32_t n_points = pa->npoints;
1529  uint32_t n_points_out = 1;
1530  size_t pt_size = ptarray_point_size(pa);
1531 
1532  double dsq = FLT_MAX;
1533 
1534  /* No-op on short inputs */
1535  if ( n_points <= min_points ) return;
1536 
1537  last = getPoint2d_cp(pa, 0);
1538  void *p_to = ((char *)last) + pt_size;
1539  for (i = 1; i < n_points; i++)
1540  {
1541  int last_point = (i == n_points - 1);
1542 
1543  /* Look straight into the abyss */
1544  pt = getPoint2d_cp(pa, i);
1545 
1546  /* Don't drop points if we are running short of points */
1547  if (n_points + n_points_out > min_points + i)
1548  {
1549  if (tolerance > 0.0)
1550  {
1551  /* Only drop points that are within our tolerance */
1552  dsq = distance2d_sqr_pt_pt(last, pt);
1553  /* Allow any point but the last one to be dropped */
1554  if (!last_point && dsq <= tolsq)
1555  {
1556  continue;
1557  }
1558  }
1559  else
1560  {
1561  /* At tolerance zero, only skip exact dupes */
1562  if (memcmp((char*)pt, (char*)last, pt_size) == 0)
1563  continue;
1564  }
1565 
1566  /* Got to last point, and it's not very different from */
1567  /* the point that preceded it. We want to keep the last */
1568  /* point, not the second-to-last one, so we pull our write */
1569  /* index back one value */
1570  if (last_point && n_points_out > 1 && tolerance > 0.0 && dsq <= tolsq)
1571  {
1572  n_points_out--;
1573  p_to = (char*)p_to - pt_size;
1574  }
1575  }
1576 
1577  /* Compact all remaining values to front of array */
1578  memcpy(p_to, pt, pt_size);
1579  n_points_out++;
1580  p_to = (char*)p_to + pt_size;
1581  last = pt;
1582  }
1583  /* Adjust array length */
1584  pa->npoints = n_points_out;
1585  return;
1586 }
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:101
static double distance2d_sqr_pt_pt(const POINT2D *p1, const POINT2D *p2)
Definition: lwinline.h:35
static size_t ptarray_point_size(const POINTARRAY *pa)
Definition: lwinline.h:58
uint32_t npoints
Definition: liblwgeom.h:442

References distance2d_sqr_pt_pt(), getPoint2d_cp(), POINTARRAY::npoints, and ptarray_point_size().

Referenced by lwcompound_linearize(), lwgeom_remove_repeated_points_in_place(), and ptarray_remove_repeated_points_minpoints().

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