我需要定义一个函数来移动" 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 =
答案 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
作为旁注,我定义CommandList = [Command]
并删除那个中缀类型构造函数。它看起来很有趣,但不太方便。
我刚刚发现了奇怪的
我需要在不导入任何已存在的函数的情况下进行此操作。
在你的问题中。由于我认为这种约束荒谬,我不会坚持它。如果您愿意,请自己复制Prelude的foldl1
和replicate
的实施。虽然严格来说,您不必手动导入它们以便使用它们。