PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ ptarray_simplify_in_place_tolerance0()

static void ptarray_simplify_in_place_tolerance0 ( POINTARRAY pa)
static

Definition at line 1938 of file ptarray.c.

1939 {
1940  uint32_t kept_it = 0;
1941  uint32_t last_it = pa->npoints - 1;
1942  const POINT2D *kept_pt = getPoint2d_cp(pa, 0);
1943  const size_t pt_size = ptarray_point_size(pa);
1944 
1945  for (uint32_t i = 1; i < last_it; i++)
1946  {
1947  const POINT2D *curr_pt = getPoint2d_cp(pa, i);
1948  const POINT2D *next_pt = getPoint2d_cp(pa, i + 1);
1949 
1950  double ba_x = next_pt->x - kept_pt->x;
1951  double ba_y = next_pt->y - kept_pt->y;
1952  double ab_length_sqr = ba_x * ba_x + ba_y * ba_y;
1953 
1954  double ca_x = curr_pt->x - kept_pt->x;
1955  double ca_y = curr_pt->y - kept_pt->y;
1956  double dot_ac_ab = ca_x * ba_x + ca_y * ba_y;
1957  double s_numerator = ca_x * ba_y - ca_y * ba_x;
1958 
1959  if (dot_ac_ab < 0.0 || dot_ac_ab > ab_length_sqr || s_numerator != 0)
1960  {
1961  kept_it++;
1962  kept_pt = curr_pt;
1963  if (kept_it != i)
1964  memcpy(pa->serialized_pointlist + pt_size * kept_it,
1965  pa->serialized_pointlist + pt_size * i,
1966  pt_size);
1967  }
1968  }
1969 
1970  /* Append last point */
1971  kept_it++;
1972  if (kept_it != last_it)
1973  memcpy(pa->serialized_pointlist + pt_size * kept_it,
1974  pa->serialized_pointlist + pt_size * last_it,
1975  pt_size);
1976  pa->npoints = kept_it + 1;
1977 }
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:404
double x
Definition: liblwgeom.h:404
uint32_t npoints
Definition: liblwgeom.h:441
uint8_t * serialized_pointlist
Definition: liblwgeom.h:448

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: