diff options
| author | Carlos Sosa <gnusosa@gnusosa.net> | 2019-09-25 09:27:43 -0700 |
|---|---|---|
| committer | Carlos Sosa <gnusosa@gnusosa.net> | 2019-09-25 09:27:43 -0700 |
| commit | 525cf5908bebd1a97f803810b8ae318bffbd6fe4 (patch) | |
| tree | 73a6eacd113674cdb5da4e6ac8e298673f366324 /ex2/Shape.hs | |
| parent | e3c1b9511ad3d77e09bddfbadf10dae8725be65a (diff) | |
Almost done with ex 2.4
Diffstat (limited to 'ex2/Shape.hs')
| -rw-r--r-- | ex2/Shape.hs | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/ex2/Shape.hs b/ex2/Shape.hs index 0f7c0a9..97916c0 100644 --- a/ex2/Shape.hs +++ b/ex2/Shape.hs @@ -3,6 +3,7 @@ module Shape , area , square , circle + , polygon ) where @@ -16,30 +17,57 @@ type Radius = Float type Side = Float type Vertex = (Float, Float) +polygon :: [Vertex] -> Shape +polygon vs = Polygon vs + area :: Shape -> Float -area (Rectangle s1 s2) = s1 * s2 -area (RtTriangle s1 s2) = s1 * s2 / 2 +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 -square :: Side -> Shape -square s = Rectangle s s +triArea :: Vertex -> Vertex -> Vertex -> Float +triArea v1 v2 v3 = + let a = distBetween v1 v2 + b = distBetween v2 v3 + c = distBetween v3 v1 + s = 0.5 * (a + b + c) + in sqrt (s * (s - a) * (s - b) * (s - c)) + +distBetween :: Vertex -> Vertex -> Float +distBetween (x1, y1) (x2, y2) = sqrt ((x1 - x2) ^ 2 + (y1 - y2) ^ 2) circle :: Radius -> Shape circle r = Ellipse r r +convex :: Shape -> Bool +convex (Rectangle a b ) = True +convex (RtTriangle a b ) = True +convex (Ellipse r1 r2) = True +convex (Polygon [_, _, _]) = True +convex (Polygon (vfirst : vsecond : vthird : vs)) = False + +crossProduct :: Vertex -> Vertex -> Vertex -> Float +crossProduct (x1, y1) (x2, y2) (x3, y3) = (x2 - x1) * (y3 - y2) - (y2 - y1) * (x3 - x2) + +square :: Side -> Shape +square s = Rectangle s s + rectangle :: Side -> Side -> Shape rectangle s1 s2 = Polygon [(x, y), (-x, y), (-x, -y), (x, -y)] where x = s1 / 2 y = s2 / 2 -rtTriangle :: Side -> Side -> Shape -rtTriangle s1 s2 = Polygon [(0, 0), (s1, 0), (0, s2)] - regularPolygon :: Int -> Side -> Shape regularPolygon n s = let angleinc = (pi * 2) / fromIntegral n - radius = (s * sin ((pi - angleinc) / 2)) / (sin angleinc) + radius = (s * sin ((pi - angleinc) / 2)) / sin angleinc regularVerts 0 _ = [] regularVerts n angle = (radius * cos angle, radius * sin angle) : regularVerts @@ -47,3 +75,6 @@ regularPolygon n s = (angle + angleinc) in Polygon (regularVerts n 0) + +rtTriangle :: Side -> Side -> Shape +rtTriangle s1 s2 = Polygon [(0, 0), (s1, 0), (0, s2)] |
