4

我正在尝试使用 OpenGL 可视化 Mandelbrot 集,并且在平滑着色方面发现了非常奇怪的行为。

让我们假设,对于当前的复数值,算法在被证明大于 2 的迭代C后已经逃逸。nZ

我编写了这样的着色部分:

if(n==maxIterations){
   color=0.0; //0.0 is black in OpenGL when put to each channel of RGB 
              //Points in M-brot set are colored black.
} else {
   color = (n + 1 - log(log(abs(Z)))/log(2.0) )/maxIterations; 
   //continuous coloring algorithm, color is between 0.0 and 1.0
   //Points outside M-brot set are colored depending of their absolute value,
   //from brightest near the edge of set to darkest far away from set.
}
glColor3f(color ,color ,color );
//OpenGL-command for making RGB-color from three channel values. 

问题是,这不能很好地工作。一些平滑是显而易见的,但并不完美。

但是当我添加两个额外的迭代时(只是在没有解释的地方发现了这个)

Z=Z*Z+C; 
n++; 

在计算颜色之前的“else”-分支中,图像出来是绝对的、优雅的平滑。

为什么会这样?为什么我们需要在检查点在集合后在着色部分放置额外的迭代?

4

3 回答 3

4

我实际上并不确定,但我这与数字 ( log(log(n))) 的日志对“小”数字的日志有点不稳定的事实有关n,在这种情况下“小”意味着接近 2 的东西。如果你Z刚刚逃脱,它接近 2。如果你继续迭代,你会(快速)从 2 越来越远,并log(log(abs(Z)))稳定下来,从而给你一个更可预测的值......然后,为您提供更平滑的值。

示例数据,任意选择:

 n            Z.real            Z.imag         |Z|  status color
-- ----------------- ----------------- ----------- ------- -----
 0             -0.74              -0.2    0.766551 bounded [nonsensical]
 1           -0.2324             0.096    0.251447 bounded [nonsensical]
 2       -0.69520624        -0.2446208    0.736988 bounded [nonsensical]
 3    -0.31652761966     0.14012381319    0.346157 bounded [nonsensical]
 4    -0.65944494902    -0.28870611409    0.719874 bounded [nonsensical]
 5    -0.38848357953     0.18077157738    0.428483 bounded [nonsensical]
 6    -0.62175887162    -0.34045357891    0.708867 bounded [nonsensical]
 7    -0.46932454495     0.22336006613    0.519765 bounded [nonsensical]
 8    -0.56962419064    -0.40965672279    0.701634 bounded [nonsensical]
 9    -0.58334691196     0.26670075833    0.641423 bounded [nonsensical]
10     -0.4708356748    -0.51115812757     0.69496 bounded [nonsensical]
11    -0.77959639873     0.28134296385    0.828809 bounded [nonsensical]
12     -0.2113833184    -0.63866792284     0.67274 bounded [nonsensical]
13     -1.1032138084    0.070007489775     1.10543 bounded 0.173185134517425
14     0.47217965836    -0.35446645882    0.590424 bounded [nonsensical]
15    -0.64269284066    -0.53474370285    0.836065 bounded [nonsensical]
16     -0.6128967403     0.48735189882    0.783042 bounded [nonsensical]
17    -0.60186945901    -0.79739278033    0.999041 bounded [nonsensical]
18     -1.0135884004     0.75985272263     1.26678 bounded 0.210802091344997
19    -0.29001471459     -1.7403558114     1.76435 bounded 0.208165835763602
20     -3.6847298156     0.80945758785     3.77259 ESCAPED 0.205910029166315
21      12.182012228     -6.1652650168     13.6533 ESCAPED 0.206137522227716
22      109.65092918     -150.41066764     186.136 ESCAPED 0.20614160700086
23     -10600.782669     -32985.538932     34647.1 ESCAPED 0.20614159039676
24     -975669186.18       699345058.7 1.20042e+09 ESCAPED 0.206141590396481
25  4.6284684972e+17 -1.3646588486e+18 1.44101e+18 ESCAPED 0.206141590396481
26 -1.6480665667e+36  -1.263256098e+36 2.07652e+36 ESCAPED 0.206141590396481

注意颜色值在 [20,22] 中的 n 处仍有多少波动,在 n=23 处稳定,从 n=24 开始保持一致。并注意 Z 值在半径为 2 的圆之外,它限制了 Mandelbrot 集。

我实际上还没有做足够的数学来确定这实际上是一个可靠的解释,但这是我的猜测。

于 2010-11-16T11:59:01.817 回答
4

因为我刚刚做了同样的程序,作为优秀的数学家,我会解释为什么,希望它会很清楚。

如果假设具有种子 C 的序列在 k 次迭代后已经逃脱。

由于它自身的函数被定义为 Limit,因为迭代趋于无穷大,因此获得接近 k 的东西并不是那么好。这就是为什么。

正如我们所知,在 2 之后序列变为无穷大,让我们考虑一些迭代 T,其中 z 变得足够大。考虑到它 C 将非常小,因为通常您会在 [-2,2] 和 [-1.5,1.5] 中查看 2 轴的集合。因此,在 T+1 次迭代中,z 将是 ~~z^2,在这种情况下很容易检查 |z| T+1 的 ~~ |z|^2 是前一个。

对于第 K 次迭代,我们的函数是 log(|z|)/2^k。在我们正在查看的情况下,很容易看出在 T+1 迭代中它将是 ~~ (来源:equationsheet.com

这是 T 次迭代的函数。

换句话说,|z| 变得比种子 C“显着”大,函数变得越来越稳定。您不想使用接近转义迭代 k 的迭代,因为实际上 Z 将接近 2 ,并且根据 C 与它相比它可能不会微不足道,因此您不会接近极限。

作为 |C| 实际上在第一次转义迭代中接近 2,您将远离限制。另一方面,如果您选择在 |Z|>100 之后进行例如转义限制,或者只进行多次迭代,您将变得更加稳定。

希望对这个问题感兴趣的人能很好地回答他。

于 2011-03-28T19:09:15.997 回答
3

目前看来,“额外迭代”的想法似乎没有令人信服的公式,如果不计算它只是有效的事实的话。

在 Wikipedia 的 Mandelbrot 文章的一篇旧版本中,有几行关于连续着色:

其次,建议进行一些额外的迭代,以便 z 可以增长。如果您在 z 逃逸后立即停止迭代,则平滑算法可能不起作用。

有总比没有好。

于 2010-09-23T22:19:04.617 回答