3

タイトルからわかるように、私はJavaでフラクタルを視覚化するための小さなプログラムをプログラミングするのに忙しいです。フラクタルを扱う人は誰でも、逃げるのにかかった反復回数だけピクセルに色を付けると、これらの愚かな「バンド」を取り除くための解決策を探すことになります。そこで、より高度なカラーリングアルゴリズムを検索して、「正規化された反復回数」を見つけました。私が使用している式は次のとおりです。

float loc = (float) 1 - Math.log(Math.log(c.abs())) / Math.log(2);

インターネット上の誰もがこのアルゴリズムにとても満足していて、誰もがそれを使用し、誰もが素晴らしい結果を得ることができます。私以外。このアルゴリズムは0と1の間のフロートを提供するはずだと思いましたが、それは起こりません。私はいくつかの計算を行い、このアルゴリズムはc.abs()> = Math.E && c.abs()<= Math.exp(2)(つまり、Math.E * Math.E)に対してのみ機能するという結論に達しました。 )。数字では、これは、この方程式への私の入力が約2.718から7.389の間でなければならないことを意味します。

ただし、複素数cは、その大きさが2より大きくなると、無限大になる傾向があると見なされます。ただし、Math.Eより小さい入力の場合、1より大きい値が得られます。また、Math.exp(2)より大きい数値の場合、負になります。これは、複素数が非常に速く脱出する場合に当てはまります。

だから私に教えてください:私は何が間違っているのですか?私は絶望的です。

ありがとう。

編集:

私は間違っていました:私が投稿したコードは正しいです、私はちょうど1.それを間違った方法で使用したので、それは正しい出力を提供しませんでした。2.マンデルブロ/ジュリアアルゴリズムのベイルアウト値を10に設定する必要がありました。そうしないと、再び愚かなバンドになってしまいます。

問題が解決しました!

4

2 に答える 2

2

すでに発見したように、スムージングが適切に見えるようになるには、ベイルアウト半径を大きくする必要があります。

2 は、座標が持つことができる最小の長さであり、それを 2 乗して初期値を追加すると、それより短い長さになることはありません。前の長さが 2.0 で、それを 2 乗した場合、長さは 4.0 (どちらの方向を指しても) になり、c の任意の値がそれを減らすことができる最大値は 2.0 です (正確に反対方向を指すことにより)。 . c がそれより大きければ、すぐに逃げ始めます。

ここで、反復回数の小数部分を推定するために、最終的な |z| を調べます。z を単純に 2 乗して c を追加しない場合、長さは 2.0 ~ 4.0 になります (救済するには、新しい値は 2.0 より大きくなければならず、救済されないためには、古い値は 2.0 未満でなければなりません)。先に出た)。

c がない場合、|z| の比例位置を 2 と 4 の間で取ると、反復回数の小数部分が得られます。|z|の場合 が 4 に近い場合、前の長さは 2 に近かったはずです。したがって、前の反復で既にベイル アウトに近づき、平滑化された結果は、それを表すために前の反復回数に近くなるはずです。2 に近い場合、前の反復は救済にはほど遠いため、平滑化された結果は新しい反復回数に近くなるはずです。

残念ながら、c はそれを台無しにします。c が大きいほど、その単純な関係で潜在的なエラーが大きくなります。古い長さがほぼ 2.0 だったとしても、c の影響で小さく見えるように着地した可能性があります。

ベイルアウトを増やすと、c を追加する効果が緩和されます。ベイルアウトが 64 の場合、結果の長さは 64 から 4096 の間になり、c の最大オフセット 2 が結果に与える影響は比例して小さくなります。

于 2013-06-22T20:18:03.640 に答える
0

反復値を省略しました。これを試してください:

float loc = <iteration_value> + (float) 1 - Math.log(Math.log(c.abs())) / Math.log(2);

は、式iteration_valueで得られた反復の数です。c

于 2012-04-05T10:47:12.677 に答える