From f3e001044829f4864360df87a69695cb962e5d36 Mon Sep 17 00:00:00 2001 From: Carlos Sosa Date: Fri, 20 Mar 2020 09:39:05 -0700 Subject: Exercise trapezoids areas sum to calculate area of polygon --- ex2/Shape.hs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'ex2') diff --git a/ex2/Shape.hs b/ex2/Shape.hs index 97916c0..d1f9e2f 100644 --- a/ex2/Shape.hs +++ b/ex2/Shape.hs @@ -24,11 +24,18 @@ area :: Shape -> Float area (Rectangle s1 s2 ) = s1 * s2 area (RtTriangle s1 s2 ) = s1 * s2 / 2 area (Ellipse r1 r2 ) = pi * r1 * r2 -area (Polygon (v1 : vs)) = polyArea vs - where - polyArea :: [Vertex] -> Float - polyArea (v2 : v3 : vs') = triArea v1 v2 v3 + polyArea (v3 : vs') - polyArea _ = 0 +area (Polygon vs) + | length vs <= 2 = 0 + | otherwise = polyArea (vs ++ [head vs]) + where polyArea :: [Vertex] -> Float + polyArea (v1: v2: vs') = trapezoidArea v1 v2 + polyArea (v2:vs') + polyArea _ = 0 + +trapezoidArea :: Vertex -> Vertex -> Float +trapezoidArea v1 v2 = + let h = fst v2 - fst v1 + aplusb = snd v2 + snd v1 + in (aplusb / 2) * h triArea :: Vertex -> Vertex -> Vertex -> Float triArea v1 v2 v3 = -- cgit v1.3-2-g0d8e