## Polygon area

if 0 {Richard Suchenwirth 2004-07-23 - Given a convex polygon represented as {x y x y ...} list of its corner coordinates, I wanted to calculate its area. This is simple for the special case of the triangle, using the "Heronic formula":}

``` proc triangle'area coords {
foreach {xa ya xb yb xc yc} \$coords break
set a [expr {hypot(\$yb-\$yc, \$xb-\$xc)}]
set b [expr {hypot(\$ya-\$yc, \$xa-\$xc)}]
set c [expr {hypot(\$ya-\$yb, \$xa-\$xb)}]
set s [expr {(\$a+\$b+\$c)/2.}]
expr {sqrt(\$s*(\$s-\$a)*(\$s-\$b)*(\$s-\$c))} ;# Heronic formula
}```

if 0 {For the general polygon I devised this recursive approach, which de facto does a triangulation, by measuring the area between the first three points, and then calling itself with the second corner's coordinates removed from the list: }

``` proc polygon::area coords {
expr {
[llength \$coords]<6? 0 :
[triangle'area [lrange \$coords 0 5]]
+ [area [lreplace \$coords 2 3]]
}
}```

if 0 { KBK 2004-07-23: Theres a shorter bit of code that calculates the area of a polygon, using the Trapezoid Rule rather than Heron' formula: }

``` proc parea { poly } {
set xprev [lindex \$poly end-1]
set yprev [lindex \$poly end]
set area 0
foreach { x y } \$poly {
set area [expr { \$area + ( (\$x - \$xprev) * ( \$y + \$yprev) ) }]
set xprev \$x; set yprev \$y
}
return [expr { abs( \$area / 2. ) }]
}```

This is a general formula for the area of any polygon; it does not depend on triangles as a special case. It depends on the polygon's being simple: that is, dividing the plane into regions with winding numbers of zero and one. If a polygon intersects itself, each region of the polygon will contribute to the result a figure of the region's area times its winding number.

KPV 2018-03-12: This formula is also known as the Shoelace formula .