Haskell中的Koch Snowflake实现

时间:2009-11-21 03:24:52

标签: haskell

我在维基百科页面上看到了这个,并且想知道是否有人有这方面的工作实现。

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

欢迎任何代码或建议。

由于

2 个答案:

答案 0 :(得分:4)

对于这些具有大量结构且与比例无关的图片,我建议使用图表包(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实例中,它将“连接”端到端的路径。

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

答案 1 :(得分:1)

  1. 计算以平面为中心的三角形的点。
  2. 在三角形的每个点上,计算三角形的三分之一的点,然后向上(沿着水平中间翻转)。
  3. 将每个三角形传递给第2步,将其结果再次传递给第2步,依此类推。
  4. 再做一遍,颠倒过来。
  5. 那应该给你一个(三维)列表的列表。现在在屏幕上绘制这些三角形到您认为合理的深度。