【问题标题】:Koch Snowflake Implementation in HaskellHaskell 中的 Koch Snowflake 实现
【发布时间】:2012-02-14 04:21:19
【问题描述】:

我在 Wikipedia 页面上查看了此内容,想知道是否有人对此有有效的实现。

我正在尝试学习 Haskell,发现它有点困难,我正在研究 Koch Snowflake 和 Sierpinski Triangle。

欢迎任何代码或建议。

谢谢

【问题讨论】:

标签: haskell


【解决方案1】:

对于这类结构丰富且与比例无关的图片,我会推荐图表包(http://projects.haskell.org/diagrams/),它确实是一段非常棒的代码,请参阅以下代码生成 Koch 雪花在几分钟内真正成为你的:

snowflake :: Int -> Trail R2
snowflake n = k <> k # rotateBy (-1/3) <> k # rotateBy (1/3)
  where k = koch n

koch :: Int -> Trail R2
koch 0 = P (-1,0) ~~ P (1,0)
koch n = k <> k # rotateBy (1/6) <> k # rotateBy (-1/6) <> k
  where k = koch (n-1) # scale (1/3)

这几乎是不言自明的,大部分魔法都在 Trail 的 Monoid 实例中,它将首尾相连地“连接”轨迹。

注意:() 是 mappend 的运算符,过去在图表中定义了它,但现在这是 GHC 7.4 中基础的一部分,并且可能会包含在 Haskell 报告的未来版本中,(#) 只是应用程序颠倒了,因为图表作者发现定义图表然后应用其属性而不是将其写入另一个方向更令人愉快(所以 k # rotateBy (1/6) 只是 rotateBy (1/6) k)。

【讨论】:

    【解决方案2】:
    1. 计算以平面为中心的三角形的点。
    2. 在三角形的每个点,计算三角形的三分之一大小的点,反之则向上(沿水平中间翻转)。
    3. 将每个三角形传递到第 2 步,将其结果再次传递到第 2 步,依此类推。
    4. 再做一遍,倒过来。

    这应该给你一个(列表)三角形的列表。现在在屏幕上将这些三角形绘制到您认为合理的深度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 2015-05-18
      相关资源
      最近更新 更多