PostGIS  2.5.7dev-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 997 of file ptarray.c.

998 {
999  const POINT2D *P1;
1000  const POINT2D *P2;
1001  const POINT2D *P3;
1002  double sum = 0.0;
1003  double x0, x, y1, y2;
1004  uint32_t i;
1005 
1006  if (! pa || pa->npoints < 3 )
1007  return 0.0;
1008 
1009  P1 = getPoint2d_cp(pa, 0);
1010  P2 = getPoint2d_cp(pa, 1);
1011  x0 = P1->x;
1012  for ( i = 2; i < pa->npoints; i++ )
1013  {
1014  P3 = getPoint2d_cp(pa, i);
1015  x = P2->x - x0;
1016  y1 = P3->y;
1017  y2 = P1->y;
1018  sum += x * (y2-y1);
1019 
1020  /* Move forwards! */
1021  P1 = P2;
1022  P2 = P3;
1023  }
1024  return sum / 2.0;
1025 }
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition: lwgeom_api.c:374
double y
Definition: liblwgeom.h:331
double x
Definition: liblwgeom.h:331
uint32_t npoints
Definition: liblwgeom.h:374
unsigned int uint32_t
Definition: uthash.h:78

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: