如何在haskell中定义n边多边形函数

时间:2015-11-16 13:49:52

标签: haskell polygon

我需要定义一个函数来移动" pen",它从左下角的(0,0)开始,根据输入绘制正确的多边形,每一边都是长度为1的形状。我需要在不导入任何已存在的函数的情况下进行。我正在使用OpenGL绘制形状。命令定义为:

data Command
= Fd Double
| Bk Double
| Lt Double
| Rt Double
| Go Command
| Command :> Command

我做了一个有效的三角形,但现在想要能够说出形状有多少边而不是定义每个形状。三角:

triangle :: Command
triangle = Fd 1 :> Rt 120
    :> Fd 1 :> Rt 120
    :> Fd 1 :> Rt 120

cabal run polygon 6

应该创建一个六边形等

到目前为止,我所得到的只有:

polygon :: Int -> Command
polygon n = 

1 个答案:

答案 0 :(得分:4)

顶点之间的角度由公式360/n给出。因此,每次转过来并移动,重复n次:

polygon n = foldl1 (:>) . replicate n (Fd 1 :> Rt (360.0 / fromIntegral n))

分手:

polygon n = foldl1 (:>) sides
  where
    sides = replicate n side
    side = Fd 1 :> Rt angle
    angle = 360.0 / fromIntegral n

Working example online

作为旁注,我定义CommandList = [Command]并删除那个中缀类型构造函数。它看起来很有趣,但不太方便。

我刚刚发现了奇怪的

  

我需要在不导入任何已存在的函数的情况下进行此操作。

在你的问题中。由于我认为这种约束荒谬,我不会坚持它。如果您愿意,请自己复制Prelude的foldl1replicate的实施。虽然严格来说,您不必手动导入它们以便使用它们。