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.




 
{def shoelace
 {lambda {:pol}
  {abs
   {/ 
    {- 
     {+ {S.map {{lambda {:pol :i} {* {car {A.get :i :pol}}
                                     {cdr {A.get {+ :i 1} :pol}}}} :pol}
               {S.serie 0 {- {A.length :pol} 2}}}
                                  {* {car {A.get {- {A.length :pol} 1} :pol}}
                                     {cdr {A.get 0 :pol}}}}
     {+ {S.map {{lambda {:pol :i} {* {car {A.get {+ :i 1} :pol}}
                                     {cdr {A.get :i :pol}}}} :pol}
               {S.serie 0 {- {A.length :pol} 2}}} 
                                  {* {car {A.get 0 :pol}}
                                     {cdr {A.get {- {A.length :pol} 1} :pol}}}}} 2}}}}
-> shoelace
 
{def pol
  {A.new {cons 3 4}
         {cons 5 11}
         {cons 12 8}
         {cons 9 5}
         {cons 5 6}}}
-> pol = [(3 4),(5 11),(12 8),(9 5),(5 6)]
 
{shoelace {pol}}
-> 30
 