質問
フラクタルのプログラミングの経験はありません。もちろん、有名なマンデルブロ画像なども見ました。
フラクタルの簡単なアルゴリズムを教えてください。
プログラミング言語はそれほど重要ではありませんが、私はactionscript、C#、Javaに最も精通しています。
フラクタルをグーグルで検索すると、多くの(複雑な)情報が得られることは知っていますが、簡単なアルゴリズムから始めて、それで遊んでみたいと思います。
基本的なアルゴリズムを改善する提案も歓迎します。たとえば、それらの素敵な色などで作成する方法などです。
解決
マンデルブロのプログラミングは簡単です。
私のquick-n-dirtyコードは以下のとおりです(バグがないことは保証されませんが、良いアウトラインです)。
概要は次のとおりです。 マンデルブロ集合は、半径2の円内の完全に複雑なグリッドにあります。
そのため、その長方形の領域のすべてのポイントをスキャンすることから始めます。 各点は複素数(x + yi)を表します。 その複素数を繰り返します:
[新しい値] = [古い値] ^ 2 + [元の値]
2つのことを追跡しながら:
1。)反復回数
2。)原点からの[新しい値]の距離。
反復の最大数に達したら、完了です。 原点からの距離が2より大きい場合、完了です。
完了したら、実行した反復回数に応じて元のピクセルに色を付けます。 次に、次のピクセルに進みます。
public void MBrot()
{
float epsilon = 0.0001; // The step size across the X and Y axis
float x;
float y;
int maxIterations = 10; // increasing this will give you a more detailed fractal
int maxColors = 256; // Change as appropriate for your display.
Complex Z;
Complex C;
int iterations;
for(x=-2; x<=2; x+= epsilon)
{
for(y=-2; y<=2; y+= epsilon)
{
iterations = 0;
C = new Complex(x, y);
Z = new Complex(0,0);
while(Complex.Abs(Z) < 2 && iterations < maxIterations)
{
Z = Z*Z + C;
iterations++;
}
Screen.Plot(x,y, iterations % maxColors); // depending on the number of iterations, color a pixel.
}
}
}
一部の詳細は次のとおりです。
1。)複素数の二乗とは何か、そしてその計算方法を正確に学ぶ。
2。)(-2,2)矩形領域をスクリーン座標に変換する方法を見つけます。
他のヒント
マンデルブローセットから始めて、それが実際に何であるかを理解する必要があります。
その背後にある考え方は比較的単純です。複雑な変数の関数から始めます
f(z)= z 2 + C
ここで、zは複雑な変数で、Cは複雑な定数です。ここで、z = 0から繰り返します。つまり、z 1 = f(0)、z 2 = f(z 1 )を計算します、z 3 = f(z 2 )など。シーケンスz 1 、z 2 、z 3 、...が bounded である定数Cのセットem>、つまり無限にならないのは、マンデルブロ集合(Wikipediaページの図の黒い集合)です。
実際には、マンデルブロ集合を描画するには次のようにします。
- 複雑な平面で長方形を選択します(たとえば、ポイント-2-2iからポイント2 + 2iまで)。
- 適切な長方形のグリッド(400x400ポイントなど)で長方形を覆い、モニター上のピクセルにマッピングします。
- 各ポイント/ピクセルについて、Cをそのポイントとし、たとえば、対応する反復シーケンスの20項z 1 、z 2 、z を計算します3 、...そして、「無限に行く」かどうかを確認します。実際には、20個の用語のいずれかの絶対値が2より大きい場合、繰り返しながらチェックできます(いずれかの用語がそうであれば、後続の用語は無制限であることが保証されます)。何らかのz_kが存在する場合、シーケンスは「無限に行きます」;それ以外の場合は、境界付きと見なすことができます。
- 特定の点Cに対応するシーケンスが境界付けられている場合、対応するピクセルを画像上に黒で描画します(マンデルブロ集合に属しているため)。それ以外の場合は、別の色で描きます。楽しんできれいなプロットを作成したい場合は、abs(20th term)の大きさに応じて異なる色で描画します。
フラクタルに関する驚くべき事実は、簡単で明らかに無害な要件から、非常に複雑なセット(特に、マンデルブロセットのフロンティア)を取得する方法です。
お楽しみください
複素数が頭痛の種になる場合、Lシステムを使用して定式化できるフラクタルが広範囲に存在します。これには、相互作用するいくつかのレイヤーが必要ですが、それぞれがそれ自体で興味深いものです。
最初にカメが必要です。前方、後方、左、右、ペンアップ、ペンダウン。 Lシステムを駆動しなくても、タートルジオメトリを使用して、タートルグラフィックスで作成できる楽しいシェイプがたくさんあります。 「ロゴグラフィック」を検索します。または「タートルグラフィックス」。完全な LOGO システムは、実際には Lisp 括弧なしのケンブリッジポーランド語構文。ただし、タートルコンセプトを使用してきれいな写真を撮るのにそれほど遠くまで行く必要はありません。
次に、Lシステムを実行するためのレイヤーが必要です。 Lシステムは、ポストシステムおよび Semi-Thueシステム、およびviriiと同様に、チューリング完全性の境界をまたいでいます。コンセプトは string-rewriting です。これは、マクロ展開、または再帰をバインドするための追加のコントロールを備えたプロシージャセットとして実装できます。マクロ展開を使用する場合(以下の例のように)、シンボルをタートルコマンドにマップするプロシージャセットと、エンコードされたタートルプログラムを実行するために文字列または配列を反復処理するプロシージャが必要です。境界再帰プロシージャセット( eg。)の場合、手順にタートルコマンドを埋め込みます。各プロシージャに再帰レベルのチェックを追加するか、ハンドラー関数に分解します。
これは、マクロ展開と非常に簡略化されたタートルコマンドのセットを使用したポストスクリプトのピタゴラスのツリーの例です。 Pythonと数学のいくつかの例については、私のを参照してください。コードゴルフチャレンジ。
サンプルの1つは、単純なマンデルブロ実装です。
学ぶべきもう1つの優れたフラクタルは、シェルピンスキートライアングルフラクタルです。
基本的に、三角形の3つの角を描画し(正三角形が推奨されますが、任意の三角形が機能します)、それらの角の1つでポイントPを開始します。 Pをランダムに3つのコーナーのいずれかに途中で移動し、そこにポイントを描画します。ランダムなコーナーに向かってPを再び半分移動し、描画して繰り返します。
ランダムな動きはランダムな結果を生むと思いますが、実際はそうではありません。
シェルピンスキーの三角形とコッホ曲線は、特殊なタイプのフレームフラクタルです。フレームフラクタルは、非線形関数を使用するため、非常に一般化されたタイプの反復関数システムです。
IFS:esのアルゴリズムは次のとおりです。
ランダムなポイントから始めます。
次の操作を何度も繰り返します(最終画像サイズに応じて、少なくとも100万回):
N個の事前定義済み変換(マトリックス変換など)のいずれかをポイントに適用します。例として、各座標に0.5を掛けます。
画面に新しいポイントをプロットします。
ポイントが画面の外側にある場合は、代わりに画面内で新しいポイントをランダムに選択します。
素敵な色が必要な場合は、色を最後に使用した変換に依存させます。
Koch Snowflake のようなシンプルなものから始めます。これは、線を取り、それを変換し、きれいに見えるまでそのプロセスを再帰的に繰り返す単純なプロセスです。
2つのポイント(線)を取得し、3番目のポイントを追加(コーナーを作成)し、作成された新しいセクションごとに繰り返すなど、非常に単純なものです。
fractal(p0, p1){
Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1;
fractal(p0,Pmid);
fractal(Pmid, p1);
}
フラクタルをアルゴリズムやプログラムの対象と見なさないかもしれません。フラクタルは概念です!これは、繰り返される詳細なパターンの数学的概念です。
したがって、下の画像に示すように、さまざまなアプローチを使用して、さまざまな方法でフラクタルを作成できます。
アプローチを選択してから、その実装方法を調査します。これらの4つの例は、 Marvin Framework を使用して実装されました。ソースコードはここ
マンデルブロ集合は、関数がオーバーフローするまで(定義された制限)関数を繰り返し評価し、オーバーフローするまでにかかった時間をチェックすることにより生成されます。
擬似コード:
MAX_COUNT = 64 // if we haven't escaped to infinity after 64 iterations,
// then we're inside the mandelbrot set!!!
foreach (x-pixel)
foreach (y-pixel)
calculate x,y as mathematical coordinates from your pixel coordinates
value = (x, y)
count = 0
while value.absolutevalue < 1 billion and count < MAX_COUNT
value = value * value + (x, y)
count = count + 1
// the following should really be one statement, but I split it for clarity
if count == MAX_COUNT
pixel_at (x-pixel, y-pixel) = BLACK
else
pixel_at (x-pixel, y-pixel) = colors[count] // some color map.
注:
valueは複素数です。複素数(a + b i)は2乗して(a a-b * b + 2 * a b i)になります。複雑な型を使用するか、その計算をループに含める必要があります。
マンデルブロやその他のフラクタルの例のためのJavaのシンプルで理解しやすいコードです
http://code.google.com/p/gaima/wiki/VLFImages
BuildFractal.jarをダウンロードしてJavaでテストし、コマンドで実行します:
java -Xmx1500M -jar BuildFractal.jar 1000 1000 default MANDELBROT
ソースコードも無料でダウンロード/探索/編集/展開できます。
まあ、シンプルでグラフィカルに魅力的なのは、実際に手をつないで行くことではありません。フラクタルのプログラミングに真剣に取り組んでいるのであれば、反復関数システムとそれらをレンダリングする際に行われた進歩について読むことをお勧めします。
上記の人々は、sierpinskiとKochの中間点の検索を使用しています。シェイプのコピー、スケーリング、および翻訳を行って「フラクタル」を実現することをお勧めします。効果。 sierpinskiのJavaの擬似コードは次のようになります。
public ShapeObject transform(ShapeObject originalCurve)
{
Make a copy of the original curve
Scale x and y to half of the original
make a copy of the copied shape, and translate it to the right so it touches the first copied shape
make a third shape that is a copy of the first copy, and translate it halfway between the first and second shape,and translate it up
Group the 3 new shapes into one
return the new shape
}
フラクタルを楽しみのために、挑戦としてプログラムすることがあります。それらはこちらで見つけることができます。コードはP5.jsライブラリを使用してJavascriptで記述されており、HTMLソースコードから直接読み取ることができます。
私が見た人にとっては、アルゴリズムは非常に単純で、コア要素を見つけて、それを何度も繰り返します。再帰関数を使用して実行していますが、異なる方法で実行できます。