PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ 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, and POINT2D::y.

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

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