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: