Given the n + 1 vertices x[0], y[0] .. x[N], y[N] of a simple polygon described in a clockwise direction, then the polygon's area can be calculated by:

abs( (sum(x[0]*y[1] + ... x[n-1]*y[n]) + x[N]*y[0]) -
     (sum(x[1]*y[0] + ... x[n]*y[n-1]) + x[0]*y[N])
   ) / 2
(Where abs returns the absolute value)

Task

Write a function/method/routine to use the the Shoelace formula to calculate the area of the polygon described by the ordered points:

     (3,4), (5,11), (12,8), (9,5), and (5,6) 



Show the answer here, on this page.




include "cowgol.coh";
 
typedef Coord is uint16; # floating point types are not supported
 
record Point is
    x: Coord;
    y: Coord;
end record;
 
sub shoelace(p: [Point], length: intptr): (area: Coord) is
    var left: Coord := 0;
    var right: Coord := 0;
 
    var y0 := p.y;
    var x0 := p.x;
 
    while length > 1 loop
        var xp := p.x;
        var yp := p.y;
        p := @next p;
        left := left + xp * p.y;
        right := right + yp * p.x;
        length := length - 1;
    end loop;
 
    left := left + y0 * p.x;
    right := right + x0 * p.y;
    if left < right then
        area := right - left;
    else
        area := left - right;
    end if;
 
    area := area / 2;
end sub;
 
var polygon: Point[] := {{3,4},{5,11},{12,8},{9,5},{5,6}};
print_i16(shoelace(&polygon[0], @sizeof polygon));
print_nl();