绘制分形火焰

时间:2015-05-08 14:11:25

标签: drawing fractals

让我先来看看我一直在阅读的PDF链接,以启动我绘制分形火焰。

http://flam3.com/flame_draves.pdf

按照Draves的伪代码,我可以使用提供的三个函数绘制Sierpinski的Gasket:

F0(x, y) = ( x/2 , y/2 ) 
F1(x, y) = ( x+1/2 , y/2 ) 
F2(x, y) = ( x/2 , y+1/2 )

伪代码:

(x, y)= a random point in the bi-unit square
iterate { 
    i = a random integer from 0 to n − 1 inclusive
    (x, y) = Fi(x, y)
    plot (xf , yf ) except during the first 20 iterations
}

根据我的理解,分形火焰是通过应用变化(非仿射函数)来制作的,但是如果我们查看附录中的变化目录,则假定第一个图像(变体0)具有身份变化。

现在我无法理解如何只使用一个函数创建这样的图像,在该函数的基础上创建一个标识函数。 (当我们在随机选择的像素上应用单位函数时,它不会无限地绘制一个像素吗?)

我不清楚是否应该使用与Sierpinski垫片相同的伪代码,还是有其他一些我在这里看不到的东西?

编辑:这是包含用Java编写的分形火焰图像生成器的最终产品:https://github.com/xtrinch/fractal_generator

1 个答案:

答案 0 :(得分:1)

  

现在我无法理解这样的图像是如何仅使用一个函数创建的,在该函数之上还有一个身份函数。 (当我们在随机选择的像素上应用单位函数时,它不会无限地绘制一个像素吗?)

然而,这些变化并不是单独使用的。相反,它们适用于我可能的仿射变换的结果。请参阅第4页底部的标题" 3 Variations":

  

F i (x,y)= Vj(a i x + b i y + c i ,d i x + e i y + f i

如果j为0且您使用的是变体0:

  

V 0 (x,y)=(x,y)

然后

  

F i (x,y)=(a i x + b i y + c i ,d i x + e i y + f i

换句话说,使用变体0只意味着简单的仿射变换,不会对其应用额外的变化。 a,b,c,d,e,f是F i 的仿射变换参数,你将拥有i套。

如果j为1,则变化函数为:

  

V 1 (x,y)=(sin(x),sin(y))

所以

  

F i (x,y)=(sin(a i x + b i y + c i ),sin(d i x + e i y + f i ))

等等。

如上所述,对于每个i函数,每个变体都可以有一个混合参数v ij ,因此您可以计算仿射变换,将所有不同的变化函数应用于仿射变换点,然后根据混合因子将结果混合在一起。