PostGIS  3.6.1dev-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 1143 of file ptarray.c.

1144 {
1145  const POINT2D *P1;
1146  const POINT2D *P2;
1147  const POINT2D *P3;
1148  double sum = 0.0;
1149  double x0, x, y1, y2;
1150  uint32_t i;
1151 
1152  if (! pa || pa->npoints < 3 )
1153  return 0.0;
1154 
1155  P1 = getPoint2d_cp(pa, 0);
1156  P2 = getPoint2d_cp(pa, 1);
1157  x0 = P1->x;
1158  for ( i = 2; i < pa->npoints; i++ )
1159  {
1160  P3 = getPoint2d_cp(pa, i);
1161  x = P2->x - x0;
1162  y1 = P3->y;
1163  y2 = P1->y;
1164  sum += x * (y2-y1);
1165 
1166  /* Move forwards! */
1167  P1 = P2;
1168  P2 = P3;
1169  }
1170  return sum / 2.0;
1171 }
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:97
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: