一些帮助渲染Mandelbrot集

时间:2010-11-01 01:14:12

标签: math graphics mandelbrot

我得到了一些与Mandelbrot集的分形可视化有关的工作。

我不是在寻找一个完整的解决方案(自然而然),我正在寻求关于复数轨道的帮助。

假设我有一个给定的Complex数字来自复平面上的一个点。我现在需要迭代其轨道序列并根据轨道是否增加数量级来绘制点。

如何收集复数的轨道?任何指导都非常感谢(链接等)。有关测试轨道序列所需的数学函数的任何指针,例如Math.pow()

我正在使用Java,但这并不是特别相关。

再次感谢, 亚历克斯

4 个答案:

答案 0 :(得分:7)

当您显示Mandelbrot集时,您只需将实数和想象平面分别转换为x和y坐标。

因此,例如,复数4.5 + 0.27i会转换为x = 4.5, y = 0.27

Mandelbrot集是等式Z = Z² + C永远不会达到| Z |的值的所有点> = 2,但在实践中,您包括在特定迭代次数内值不超过2的所有点,例如1000.要获得通常在集合中看到的彩色渲染,请为点指定不同的颜色在集合之外取决于它们达到极限的速度。

由于它是复数,所以等式实际上是Zr + Zi = (Zr + Zi)² + Cr + Ci。你可以把它分成两个方程,一个用于真实平面,一个用于虚平面,然后它只是普通代数。 C是您要测试的点的坐标,Z的初始值为零。

这是我的多线程Mandelbrot生成器的图像:)

Mandelbrot set

答案 1 :(得分:3)

实际上,Mandelbrot集是迭代收敛的复数集。

所以Mandelbrot套装中唯一的点就是中间的那种无聊的颜色。你看到的所有漂亮的颜色只是表示边界附近的点(但是错误的一面)旋转到无穷大的速度。

在mathspeak中,

M = {c in C : lim (k -> inf) z_k = 0 } where z_0 = c, z_(k+1) = z_k^2 + c

即选择任何复数c。现在确定它是否在集合中,重复迭代它z_0 = c,z_(k + 1)= z_k ^ 2 + c,并且z_k将接近零或无穷大。如果它的极限(当k倾向于无穷大)为零,那么它就在。否则不是。

有可能证明曾经| z_k | > 2,它不会收敛。这是优化的一个很好的练习:IIRC | Z_k | ^ 2> 2就足够了......无论哪种方式,正方形都会为你节省昂贵的sqrt()函数。

答案 2 :(得分:1)

Wolfram Mathworld有一个nice site谈论Mandelbrot集。

复杂课程将是最有帮助的。

也许像this这样的例子会激发一些想法。我不建议使用Applet。

除了正弦,余弦,指数等函数之外,您还必须知道如何使用复数对加法,减法,乘法,除法和幂运算进行加法,减法,乘法,除法和幂运算。如果你不知道那些,我就会开始那里。

我所教的那本书是Ruel V. Churchill "Complex Variables"

答案 3 :(得分:0)

/d{def}def/u{dup}d[0 -185 u 0 300 u]concat/q 5e-3 d/m{mul}d/z{A u m B u
m}d/r{rlineto}d/X -2 q 1{d/Y -2 q 2{d/A 0 d/B 0 d 64 -1 1{/f exch d/B
A/A z sub X add d B 2 m m Y add d z add 4 gt{exit}if/f 64 d}for f 64 div
setgray X Y moveto 0 q neg u 0 0 q u 0 r r r r fill/Y}for/X}for showpage