
From: Rafael Almeida [mailto:almeidaraf@gmail.com]
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.
You are right, my solution was wrong. If you don't mind rounding errors, this is another solution: import List regularPolygon n s = iteratedAdd segments where a = 2 * pi / (fromIntegral n) segments = [rotatedSegment (fromIntegral i) | i <- [0..n-1]] rotatedSegment i = (s*sin(i*a),s*cos(i*a)) iteratedAdd = snd . mapAccumR (\s x->(add s x, add s x)) (0,0) add (x1,y1) (x2,y2) = (x1+x2,y1+y2) With this list comprehension, your solution could be written like this: regularPolygon n s = [(r * cos(a i), r * sin(a i)) | i <- [0..n-1]] where a i = 2 * fromIntegral i * pi / fromIntegral n r = sqrt(s^2 / (2 * (1 - cos(2 * pi / fromIntegral n)))) -- Frank Buss, fb@frank-buss.de http://www.frank-buss.de, http://www.it4-systems.de