PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ ptarray_signed_area()

double ptarray_signed_area ( const POINTARRAY pa)

Returns the area in cartesian units.

Area is negative if ring is oriented CCW, positive if it is oriented CW and zero if the ring is degenerate or flat. http://en.wikipedia.org/wiki/Shoelace_formula

Definition at line 1016 of file ptarray.c.

1017 {
1018  const POINT2D *P1;
1019  const POINT2D *P2;
1020  const POINT2D *P3;
1021  double sum = 0.0;
1022  double x0, x, y1, y2;
1023  uint32_t i;
1024 
1025  if (! pa || pa->npoints < 3 )
1026  return 0.0;
1027 
1028  P1 = getPoint2d_cp(pa, 0);
1029  P2 = getPoint2d_cp(pa, 1);
1030  x0 = P1->x;
1031  for ( i = 2; i < pa->npoints; i++ )
1032  {
1033  P3 = getPoint2d_cp(pa, i);
1034  x = P2->x - x0;
1035  y1 = P3->y;
1036  y2 = P1->y;
1037  sum += x * (y2-y1);
1038 
1039  /* Move forwards! */
1040  P1 = P2;
1041  P2 = P3;
1042  }
1043  return sum / 2.0;
1044 }
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
double y
Definition: liblwgeom.h:390
double x
Definition: liblwgeom.h:390
uint32_t npoints
Definition: liblwgeom.h:427

References getPoint2d_cp(), POINTARRAY::npoints, POINT2D::x, pixval::x, and POINT2D::y.

Referenced by lwgeom_subdivide_recursive(), lwpoly_area(), ptarray_isccw(), and test_ptarray_signed_area().

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