4

OpenGLでマンデルブロ集合を視覚化しようとしていますが、滑らかな色付けに関しては非常に奇妙な動作を見つけました。

現在の複素数値について、 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. 

問題は、これはうまく機能しないということです。若干のスムージングは​​目立ちますが、完璧ではありません。

しかし、2つの反復を追加すると(説明なしでこれがどこかに見つかりました)

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以降で一貫していることに注目してください。また、マンデルブロ集合の境界となる半径2の円の外側にZ値があることに注意してください。

私はこれが実際に確かな説明であることを確認するのに十分な数学を実際に行っていませんが、それは私の推測です。

于 2010-11-16T11:59:01.817 に答える
4

私はちょうど同じプログラムを作成し、優れた数学者としてその理由を説明しますので、それが明確になることを願っています。

シードCのシーケンスがk回の反復後にエスケープされたとしましょう。

関数自体は、反復が無限大になるときにLimitとして定義されるため、kに近いものを取得するのはそれほど良くありません。これが理由です。

2の後、シーケンスが無限大になることがわかっているので、zが十分に大きくなった反復Tについて考えてみましょう。通常、2軸の[-2,2]と[-1.5,1.5]のセットを見ると、Cは非常に小さくなります。したがって、T + 1の反復では、zは前の反復から~~ z ^ 2になり、その場合は簡単に確認できます| z | T+1のは前の~~|z |^2になります。

K番目の反復の関数はlog(| z |)/ 2^kです。私たちが見ている場合、それは簡単にわかります。T+ 1の反復では、~~になります (出典:equationsheet.com

これはT反復での関数です。

言い換えれば、| z | シードCよりも「大幅に」大きくなり、関数はますます安定します。実際にはZが2に近くなるため、反復kのエスケープに近い反復を使用することは望ましくありません。また、Cによっては、それに比べてそれほど小さくない場合があり、制限に近づくことはありません。

として|C| は実際には最初のエスケープ反復で2に近く、制限からかなり離れています。一方、たとえばバウンドをエスケープするために| Z |> 100の後にそれを作成することを選択した場合、またはさらに数回の反復を行う場合は、非常に安定します。

質問に興味のある人が彼に良い答えをしてくれることを願っています。

于 2011-03-28T19:09:15.997 に答える
3

今のところ、「追加の反復」のアイデアには、それが機能するという事実を数えない限り、説得力のある公式がないようです。

ウィキペディアのマンデルブロの記事の古いバージョンの1つに、連続着色に関する行があります。

次に、zが大きくなるように、いくつかの追加の反復を実行することをお勧めします。zがエスケープした直後に反復を停止すると、平滑化アルゴリズムが機能しない可能性があります。

何もないよりマシ。

于 2010-09-23T22:19:04.617 に答える