フラクタルのプログラミングの経験はありません。もちろん、有名なマンデルブロの画像などを見てきました。
フラクタルの簡単なアルゴリズムを教えてください。
プログラミング言語はさほど重要ではありませんが、私はactionscript、C#、Javaに最も精通しています。
フラクタルをグーグルで検索すると、多くの(複雑な)情報が得られることは知っていますが、簡単なアルゴリズムから始めて遊んでみたいと思います。
基本的なアルゴリズムを改善するための提案も歓迎します。たとえば、それらの素敵な色などで作成する方法などです。
マンデルブロのプログラミングは簡単です。
quick-n-dirtyコードは以下のとおりです(バグがないことは保証されませんが、概要は良好です)。
概要は次のとおりです。マンデルブロ集合は、完全に半径2の円内の複合グリッドにあります。
そのため、その長方形の領域内のすべてのポイントをスキャンすることから始めます。各点は複素数(x + yi)を表します。その複素数を繰り返します:
[new value] = [old-value]^2 + [original-value]
2つのことを追跡しながら:
1.)反復回数
2.)原点からの[新しい値]の距離。
反復の最大数に達したら、完了です。 Originからの距離が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)矩形領域をスクリーン座標に変換する方法を見つけます。
Mandelbrot set から始めて、それが実際に何であるかを理解する必要があります。
その背後にある考え方は比較的単純です。複雑な変数の機能から始めます
f(z)= z2 + C
ここで、zは複素数variableであり、Cは複素数constantです。ここで、z = 0から繰り返します。つまり、zを計算します。1 = f(0)、z2 = f(z1)、z3 = f(z2) 等々。シーケンスzの定数Cのセット1、z2、z3、...はbounded、つまり無限にならない、マンデルブロ集合(Wikipediaページの図の黒い集合)です。
実際には、マンデルブロ集合を描くには次を行う必要があります。
フラクタルに関する驚くべき事実は、非常に複雑なセット(特に、マンデルブロセットのfrontier)を簡単で明らかに無害な要件から取得する方法です。
楽しい!
複素数が頭痛の種になる場合、Lシステムを使用して定式化できるフラクタルが広範囲に存在します。これには、相互作用するいくつかのレイヤーが必要ですが、それぞれがそれ自体で興味深いものです。
まず、カメが必要です。前方、後方、左、右、ペンアップ、ペンダウン。 Lシステムを駆動しなくても、タートルジオメトリを使用して、タートルグラフィックスで作成できる楽しいシェイプがたくさんあります。 「ロゴグラフィック」または「タートルグラフィック」を検索します。完全な [〜#〜] logo [〜#〜] システムは、実際には [〜#〜] lisp [〜#〜] 括弧なしのプログラミング環境を使用しています- ケンブリッジポーランド語 構文。しかし、タートルのコンセプトを使用してきれいな写真を撮るために、それほど遠くまで行く必要はありません。
次に、Lシステムを実行するためのレイヤーが必要です。 Lシステムは Post-systems および Semi-Thue systems に関連しており、viriiと同様に、チューリング完全性の境界をまたいでいます。コンセプトはstring-rewritingです。これは、マクロ展開、または再帰をバインドするための追加のコントロールを備えたプロシージャセットとして実装できます。マクロ展開を使用する場合(下の例のように)、まだシンボルをタートルコマンドにマップするプロシージャセットと、エンコードされたタートルプログラムを実行するために文字列または配列を反復処理するプロシージャが必要です。境界再帰プロシージャセット( eg。 )の場合、タートルコマンドをプロシージャに埋め込み、再帰レベルのチェックを各プロシージャに追加するか、ハンドラ関数にファクタリングします。
以下は、マクロ拡張と非常に簡略化されたタートルコマンドのセットを使用した、ポストスクリプトのピタゴラスのツリーの例です。 pythonおよび数学のいくつかの例については、私の code golf challenge を参照してください。
Chaos and Fractals と呼ばれるすばらしい本があります。これには、各章の最後に、フラクタルやその他の例を実装する簡単なサンプルコードがあります。ずっと前にその本を読んだとき、各サンプルプログラム(一部の基本的な方言)をWebページで実行されるJavaアプレットに変換しました。アプレットはここにあります: http://hewgill.com/chaos-and-fractals/
サンプルの1つは、単純なマンデルブロ実装です。
シェルピンスキーの三角形とコッホ曲線は、特殊なタイプのフレームフラクタルです。フレームフラクタルは、非線形関数を使用するため、非常に一般化されたタイプの反復関数システムです。
IFS:esのアルゴリズムは次のとおりです。
_Start with a random point.
_
以下を何度も繰り返します(最終的な画像サイズに応じて、少なくとも100万回):
Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.
ポイントが画面の外側にある場合は、代わりに画面内の新しいポイントをランダムに選択します。
素敵な色が必要な場合は、色を最後に使用した変換に依存させます。
学ぶべきもう1つの優れたフラクタルは、シェルピンスキートライアングルフラクタルです。
基本的に、三角形の3つの角を描画し(正三角形が推奨されますが、任意の三角形が機能します)、それらの角の1つでポイントPを開始します。 Pをランダムに3つのコーナーのいずれかに途中で移動し、そこにポイントを描画します。再びPをランダムなコーナーに向かって半分移動し、描画して繰り返します。
ランダムな動きはランダムな結果を生むと思いますが、実際はそうではありません。
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.
ノート:
値は複素数です。複素数(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デフォルトMANDELBROT
ソースコードは、ダウンロード/探索/編集/展開も無料です。
まあ、シンプルでグラフィカルに魅力的なものは、実際に手をつないで行くことはありません。フラクタルのプログラミングに真剣に取り組んでいる場合は、反復関数システムとそれらのレンダリングで行われた進歩について読むことをお勧めします。
上記の人々は、sierpinskiとKochの中間点を見つけることを使用しています。シェイプをコピーし、それらをスケーリングしてから、「フラクタル」効果を達成するために変換することをお勧めします。 Java sierpinskiの擬似コードは次のようになります。
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ソースコードから直接読み取ることができます。
私が見た人にとって、アルゴリズムは非常に単純で、コア要素を見つけて、それを何度も繰り返します。私は再帰関数でそれを行いますが、別の方法で行うことができます。