# [Haskell-cafe] Area from [(x,y)] using foldl

michael rice nowgate at yahoo.com
Sun Nov 8 18:07:45 EST 2009

```Hi Casey,

I was already aware of the translation thing, but didn't want to complicate.

Lot's of ways to skin a cat. I wrote a Lispy solution, then had the feeling I could improve on it w/Haskell. Picking the right tool takes practice.

Thanks,

Michael

--- On Sun, 11/8/09, Casey Hawthorne <caseyh at istar.ca> wrote:

From: Casey Hawthorne <caseyh at istar.ca>
Subject: Re: [Haskell-cafe] Area from [(x,y)] using foldl
Date: Sunday, November 8, 2009, 5:44 PM

Sorry, I forgot to add that if the polygon is very far from the
origin, you may have overflow or increased round off error; it is
better to translate the polygon back to the origin, before doing the
area calculation.

How about these BETTER type signatures.

-- Area of a Polygon

import Data.List

type X = Double
type Y = Double
type Area = Double

poly1 = [(0,1),(5,0),(3,4)]::[(X,Y)]

areaPoly :: [(X,Y)] -> Area

areaPolyCalc :: (Area,(X,Y)) -> (X,Y) -> (Area,(X,Y))

areaPoly (pt:pts) = 0.5 * (fst (foldl' areaPolyCalc (0,pt) pts))

areaPolyCalc (sum,(x,y)) (xNext,yNext) =
(sum + (x * yNext - xNext * y),(xNext,yNext))
--
Regards,
Casey
_______________________________________________