【问题标题】:How to define an n-sided polygon function in haskell如何在haskell中定义一个n边多边形函数
【发布时间】:2016-02-23 03:41:12
【问题描述】:

我需要定义一个函数来移动从左下角 (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 = 

【问题讨论】:

    标签: haskell polygon


    【解决方案1】:

    顶点之间的角度由公式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 的实现。虽然严格来说,您不必手动导入它们来使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-05
      • 2021-07-05
      • 2018-03-24
      • 1970-01-01
      • 2013-03-11
      • 2022-11-10
      相关资源
      最近更新 更多