PostGIS  3.3.9dev-r@@SVN_REVISION@@

◆ ptarray_simplify_in_place_tolerance0()

static void ptarray_simplify_in_place_tolerance0 ( POINTARRAY pa)
static

Definition at line 1658 of file ptarray.c.

1659 {
1660  uint32_t kept_it = 0;
1661  uint32_t last_it = pa->npoints - 1;
1662  const POINT2D *kept_pt = getPoint2d_cp(pa, 0);
1663  const size_t pt_size = ptarray_point_size(pa);
1664 
1665  for (uint32_t i = 1; i < last_it; i++)
1666  {
1667  const POINT2D *curr_pt = getPoint2d_cp(pa, i);
1668  const POINT2D *next_pt = getPoint2d_cp(pa, i + 1);
1669 
1670  double ba_x = next_pt->x - kept_pt->x;
1671  double ba_y = next_pt->y - kept_pt->y;
1672  double ab_length_sqr = ba_x * ba_x + ba_y * ba_y;
1673 
1674  double ca_x = curr_pt->x - kept_pt->x;
1675  double ca_y = curr_pt->y - kept_pt->y;
1676  double dot_ac_ab = ca_x * ba_x + ca_y * ba_y;
1677  double s_numerator = ca_x * ba_y - ca_y * ba_x;
1678 
1679  if (dot_ac_ab < 0.0 || dot_ac_ab > ab_length_sqr || s_numerator != 0)
1680  {
1681  kept_it++;
1682  kept_pt = curr_pt;
1683  if (kept_it != i)
1684  memcpy(pa->serialized_pointlist + pt_size * kept_it,
1685  pa->serialized_pointlist + pt_size * i,
1686  pt_size);
1687  }
1688  }
1689 
1690  /* Append last point */
1691  kept_it++;
1692  if (kept_it != last_it)
1693  memcpy(pa->serialized_pointlist + pt_size * kept_it,
1694  pa->serialized_pointlist + pt_size * last_it,
1695  pt_size);
1696  pa->npoints = kept_it + 1;
1697 }
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 size_t ptarray_point_size(const POINTARRAY *pa)
Definition: lwinline.h:58
double y
Definition: liblwgeom.h:405
double x
Definition: liblwgeom.h:405
uint32_t npoints
Definition: liblwgeom.h:442
uint8_t * serialized_pointlist
Definition: liblwgeom.h:449

References getPoint2d_cp(), POINTARRAY::npoints, 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: