2012-04-04 10 views
1

タイトルからわかるように、私はJavaでフラクタルを視覚化するための小さなプログラムをプログラミングしています。フラクタルを扱う人は誰でも、逃げ出すために必要な反復回数でピクセルを色付けするだけで、このような愚かな「バンド」を取り除くソリューションを探し求めます。 そこで、より高度なカラーリングアルゴリズムを探して、「正規化された繰り返し回数」を見つけました。私が使用している式は次のとおりです。インターネット上の正規化反復回数が機能しません。私は間違って何をしていますか?

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

誰もが誰もがそれを使用して、everbodyは素晴らしい結果を取得し、このアルゴリズムについてとても幸せです。私を除いて。私は思った、このアルゴリズムは0と1の間のフロートを提供する必要があります。しかし、それは起こりません。私はいくつかの計算を行い、結論に達しました。このアルゴリズムはc.abs()> = Math.Eの場合にのみ有効です。& & c.abs()< = Math.exp(2)(これはMath.E * E)。 これは、この方程式への私の入力が約2.718と7.389の間でなければならないことを意味します。

しかし、複素数cは、その大きさが2より大きい場合、無限大に向かうことが検討されます。しかし、Math.Eより小さい任意の入力に対しては、1より大きい値が得られます。そして、Math.exp(2)より大きい任意の数の場合、負になります。複雑な数値が本当に速くエスケープする場合はそうです。

だから私に教えてください:私は間違って何をしています。私は絶望的です。

ありがとうございました。

EDIT:

私が間違っていた:私は投稿コードが正しい、私はちょうど 1.それを間違った方法を使用し、それは右の出力を提供していませんでした。 2. mandelbrot/juliaアルゴリズムの救済額を10に設定する必要がありました。そうしないと、愚かなバンドが再び発生します。

問題が解決しました。

+0

あなたはJavaで何かをやっているが、あなたは救済値が2ではなく、10 –

+0

にタグを付けていなかった、平滑実装するときは、2よりもはるかに大きな値に救済を増やす必要があります実際には10を超えています(OPがこれまでにこれを発見した可能性があります)。なぜ私は答えとして説明しなければならないと思います。 – karatedog

+0

@karatedogする必要がありますするには、Java – sh1

答えて

0

あなたは反復値を残してきた、これを試してみてください。

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

式でcをもたらした反復回数です。

1

既に発見したように、スムーズに見えるようにするには、救済の半径を大きくする必要があります。

2は、座標を四角形にして初期値を追加するときに、最小の長さになるような座標の最小長です。以前の長さが2.0であり、それを二乗すると、長さが4.0(どちらの方向を指していても)で、cの任意の値がそれを減らすことができる最大値は2.0(正確に反対方向を指す) 。もしcがそれより大きければ、すぐに逃げ始めるだろう。

ここで、反復回数の小数部分を推定するために、最後の| z |を見ます。 zが単純に二乗されて追加されなかった場合、それは2.0と4.0の間の長さを持ちます(新しい値は、救済するために2.0より大きくなければならず、古い値は救済されないために2.0未満であったに違いありません)先に出る)。

cを指定しない場合、| z |の2と4の比例する位置は、反復回数の小数部分を示します。| z |前の長さが2に近づいていなければならないので、それは前の反復で救済することにすでに近く、平滑化された結果は前の反復カウントに近いはずです。 2に近い場合は、以前の反復が救済の対象から外れていたので、平滑化された結果は新しい反復回数に近づくはずです。

残念ながら、Cはそれを上げます。 cが大きいほど、単純な関係に潜在的な誤差が大きくなります。古い長さが2.0に近い場合でも、cの影響が小さくなければならないように見えるように着陸した可能性があります。

救済措置を増やすと、cを追加する効果が軽減されます。救済措置が64の場合、結果の長さは64〜4096になり、cの最大オフセットは2に比例して小さくなります。

関連する問題