ズーム深度に対する距離推定を使用したジュリア集合の着色
ここから学んだ距離推定カラーリングアルゴリズムを使用して、このビデオのように、リーマン球に投影されたジュリア集合にカラーリングすることができました。ただし、ジュリア集合の多項式交配を表示し始めると、下の最初の画像に示すように、このカラーリングアルゴリズムを使用すると一貫性のない結果が得られました。特定の部分が他の部分よりも鮮明です。これは、多項式の交配により、ズームインせずにフラクタルのより深い部分が引き出されるため、同じ距離調整を使用すると、ズームインした部分が他の部分よりも「ぼやけ」ます。
そのため、私が必要だと思うのは、ジュリア集合にどのように「ズームイン」しているかを検出するためのある種のアルゴリズムであり、それに応じて距離を調整できます。軌道が脱出するのにかかる反復回数に基づいて試してみましたが(深くなるほど、軌道が脱出するのにかかる反復回数が多くなります)、意図した効果が得られませんでした(下の2番目の画像-特定のパーツはほとんど見えません)。これが私のカラーリングのコードです:
for (iter = currentMatingIteration + 1; iter < maxIterations && (w.x * w.x + w.y * w.y < bailout*bailout); iter++)
{
d2 *= 4.0 * w2;
// Julia Set algorithm
w = c_2(w) + c;
w2 = w.x * w.x + w.y * w.y;
// Distance checker
if(w2 > maxDist)
break;
}
float fineness = 7; // the higher, the less "blurry"
//float fineness = 15; // this is used for the second picture below
float d = sqrt(w2 / d2) * log(w2); // this is the distance estimation
float dist = clamp(sqrt(d * pow(fineness, 2)), 0, 1); // this is the adjustments I make for coloring
//float dist = clamp(sqrt(d * pow(fineness * (float(iter) / maxIterations), 2)), 0, 1); // This is my attempt to solve this problem, used in the second picture below
私のプロジェクトはテストのためにここにあります。
編集:
これはおそらくズームの深さを理解するための一般的な解決策ではありませんが、この問題で機能したのは、嵌合アルゴリズムのプルバック部分で導関数を計算し、それを距離推定を計算するための初期値として使用することです。ジュリア集合ごとに(コメントのクロードに感謝します)。成功した結果は以下のとおりです。
リーマン球調整
調整なし:
調整あり:
回答
距離推定画像を生成する際の重要なポイントは、正しいスケールを基準にして導関数を作成することです。典型的な2Dジュリア集合またはマンデルブロ集合画像の場合、ピクセル間隔に関連する導関数を取ります(実際には、連鎖律を使用して導関数を計算するときに、ピクセル座標から複素平面への変換を考慮に入れます)。
画像には、ピクセルからの単純な線形マッピング、たとえば3Dでのリーマン球の投影が必要ありません。おそらく立体投影を考慮する必要がありますが、おそらく歪みは0に近い領域では大きすぎません。理想的には、導関数(したがって距離の推定値)は3Dの球表面の表面距離に対してスケーリングされます。