module Shape ( Shape , area , square , circle ) where data Shape = Rectangle Side Side | Ellipse Radius Radius | RtTriangle Side Side | Polygon [Vertex] deriving Show type Radius = Float type Side = Float type Vertex = (Float, Float) area :: Shape -> Float area (Rectangle s1 s2) = s1 * s2 area (RtTriangle s1 s2) = s1 * s2 / 2 square :: Side -> Shape square s = Rectangle s s circle :: Radius -> Shape circle r = Ellipse r r 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) regularVerts 0 _ = [] regularVerts n angle = (radius * cos angle, radius * sin angle) : regularVerts (n - 1) (angle + angleinc) in Polygon (regularVerts n 0)