2009-11-21 37 views
1

我在维基百科页面上看到这个,想知道是否有人有这个工作实现。Haskell的科赫雪花实现

我想学习Haskell,发现它有点困难,我正在Koch雪花和Sierpinski三角形上工作。

欢迎任何代码或建议。

由于

+0

对于sierpinski的三角你可以看这里: [http://stackoverflow.com/questions/1726698/code-golf-sierpinskis-triangle](http://stackoverflow.com/questions/1726698/code-golf- sierpinskis-triangle)你也许会觉得这有帮助: [http://www.hardforum.com/showthread.php?p=1034927217](http://www.hardforum.com/showthread.php?p=1034927217)这里有一个建议也可能有所帮助: [http://www.rhinocerus.net/forum/lang-functional/96046-haskell-fractals-specifically-snowflakes.html](http://www.rhinocerus.net /forum/lang-functional/96046-haskell-fractals-specifically-snowflakes.html) – 2009-11-21 05:49:05

回答

1
  1. 计算在所述平面为中心的三角形的点。
  2. 在三角形的每个点上,计算三分之一大小的三角形的点,反之亦然(沿水平中间翻转)。
  3. 将每个三角形传递给步骤2,再次将结果传递给步骤2,依此类推。
  4. 再做一遍,倒过来。

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

4

对于这些类型的图片有很多的结构和独立的规模,我会推荐图包(http://projects.haskell.org/diagrams/),这是一个非常神奇的代码片段,请参阅以下代码以生成由您写的科赫雪花真正在短短的几分钟内:

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) 

这几乎是不言自明的,最神奇的是开拓者的含半幺群实例,将“串联”的创新端到端。 (<>)是mappend的操作符,过去定义了它的图表,但现在它已成为GHC 7.4中的基础的一部分,并且可能包含在未来版本的Haskell报告中,(#)是只是应用程序颠倒过来了,因为图表作者发现定义图表更令人愉快,然后应用其属性而不是将其写入另一个方向(所以k#rotateBy(1/6)只是rotateBy(1/6)k)。