
On 8/19/07, Frank Buss
(*) Exercise 2.2
Define a function regularPolygon :: Int -> Side -> Shape such that regularPolygon n s is a regular polygon with n sides, each of length s. (Hint: consider using some of Haskell's trigonometric functions, such as sin :: Float -> Float, cos :: Float -> Float, and tan :: Float -> Float.) <snip> import System
type Shape = [Vertex] type Side = Float type Vertex = (Float, Float)
regularPolygon :: Int -> Side -> Shape regularPolygon n s = (buildList n) where buildList 0 = [] buildList i = let x = cos(alpha) * s y = sin(alpha) * s alpha = 2*pi/(fromIntegral n)*(fromIntegral i) in (x,y) : buildList (i-1)
That looks good, but I'd do like this: regularPolygon :: Int -> Side -> Shape regularPolygon n s = (buildList n) where buildList 0 = [] buildList i = let x = cos(alpha) * r y = sin(alpha) * r alpha = 2*(fromIntegral i)*pi / fromIntegral n r = sqrt (s^2 / (2*(1 - cos (2*pi / fromIntegral n)))) in (x,y) : buildList (i-1) I used the cosine law in order to calculate r. After all, s is actually the size of the side of the polygon and not the distance of its vertices from the origin.