Updated 2011-12-02 03:58:18 by RLE

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.

See also: