web-dev-qa-db-ja.com

フラクタルをプログラムするには?

フラクタルのプログラミングの経験はありません。もちろん、有名なマンデルブロの画像などを見てきました。

フラクタルの簡単なアルゴリズムを教えてください。

プログラミング言語はさほど重要ではありませんが、私はactionscript、C#、Javaに最も精通しています。

フラクタルをグーグルで検索すると、多くの(複雑な)情報が得られることは知っていますが、簡単なアルゴリズムから始めて遊んでみたいと思います。

基本的なアルゴリズムを改善するための提案も歓迎します。たとえば、それらの素敵な色などで作成する方法などです。

70
Sander Versluys

マンデルブロのプログラミングは簡単です。
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)矩形領域をスクリーン座標に変換する方法を見つけます。

53
abelenky

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ページの図の黒い集合)です。

実際には、マンデルブロ集合を描くには次を行う必要があります。

  • 複素平面内の長方形を選択します(たとえば、ポイント-2-2iからポイント2 + 2iまで)。
  • 適切な長方形のポイントグリッド(400x400ポイントなど)で長方形を覆います。これは、モニターのピクセルにマップされます。
  • 各ポイント/ピクセルに対して、Cをそのポイントとし、対応する反復シーケンスzの20項を計算します1、z2、z3、...そして、それが「無限に行く」かどうかを確認します。実際には、繰り返しながら、20個の用語のいずれかの絶対値が2より大きいかどうかを確認できます(いずれかの用語がそうであれば、後続の用語は無制限であることが保証されます)。何らかのz_kが存在する場合、シーケンスは「無限大になります」。それ以外の場合は、境界付きと見なすことができます。
  • 特定の点Cに対応するシーケンスが制限されている場合、対応するピクセルを画像上に黒で描画します(マンデルブロ集合に属しているため)。それ以外の場合は、別の色で描きます。楽しみながらきれいなプロットを作成したい場合は、abs(20th term)の大きさに応じて異なる色で描画します。

フラクタルに関する驚くべき事実は、非常に複雑なセット(特に、マンデルブロセットのfrontier)を簡単で明らかに無害な要件から取得する方法です。

楽しい!

26

複素数が頭痛の種になる場合、Lシステムを使用して定式化できるフラクタルが広範囲に存在します。これには、相互作用するいくつかのレイヤーが必要ですが、それぞれがそれ自体で興味深いものです。

まず、カメが必要です。前方、後方、左、右、ペンアップ、ペンダウン。 Lシステムを駆動しなくても、タートルジオメトリを使用して、タートルグラフィックスで作成できる楽しいシェイプがたくさんあります。 「ロゴグラフィック」または「タートルグラフィック」を検索します。完全な [〜#〜] logo [〜#〜] システムは、実際には [〜#〜] lisp [〜#〜] 括弧なしのプログラミング環境を使用しています- ケンブリッジポーランド語 構文。しかし、タートルのコンセプトを使用してきれいな写真を撮るために、それほど遠くまで行く必要はありません。

次に、Lシステムを実行するためのレイヤーが必要です。 Lシステムは Post-systems および Semi-Thue systems に関連しており、viriiと同様に、チューリング完全性の境界をまたいでいます。コンセプトはstring-rewritingです。これは、マクロ展開、または再帰をバインドするための追加のコントロールを備えたプロシージャセットとして実装できます。マクロ展開を使用する場合(下の例のように)、まだシンボルをタートルコマンドにマップするプロシージャセットと、エンコードされたタートルプログラムを実行するために文字列または配列を反復処理するプロシージャが必要です。境界再帰プロシージャセット( eg。 )の場合、タートルコマンドをプロシージャに埋め込み、再帰レベルのチェックを各プロシージャに追加するか、ハンドラ関数にファクタリングします。

以下は、マクロ拡張と非常に簡略化されたタートルコマンドのセットを使用した、ポストスクリプトのピタゴラスのツリーの例です。 pythonおよび数学のいくつかの例については、私の code golf challenge を参照してください。

ps l-system pythagoras tree luser-droog

9
luser droog

Chaos and Fractals と呼ばれるすばらしい本があります。これには、各章の最後に、フラクタルやその他の例を実装する簡単なサンプルコードがあります。ずっと前にその本を読んだとき、各サンプルプログラム(一部の基本的な方言)をWebページで実行されるJavaアプレットに変換しました。アプレットはここにあります: http://hewgill.com/chaos-and-fractals/

サンプルの1つは、単純なマンデルブロ実装です。

8
Greg Hewgill

シェルピンスキーの三角形とコッホ曲線は、特殊なタイプのフレームフラクタルです。フレームフラクタルは、非線形関数を使用するため、非常に一般化されたタイプの反復関数システムです。

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.

ポイントが画面の外側にある場合は、代わりに画面内の新しいポイントをランダムに選択します。

素敵な色が必要な場合は、色を最後に使用した変換に依存させます。

6

学ぶべきもう1つの優れたフラクタルは、シェルピンスキートライアングルフラクタルです。

基本的に、三角形の3つの角を描画し(正三角形が推奨されますが、任意の三角形が機能します)、それらの角の1つでポイントPを開始します。 Pをランダムに3つのコーナーのいずれかに途中で移動し、そこにポイントを描画します。再びPをランダムなコーナーに向かって半分移動し、描画して繰り返します。

ランダムな動きはランダムな結果を生むと思いますが、実際はそうではありません。

参照: http://en.wikipedia.org/wiki/Sierpinski_triangle

6
abelenky

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);
}
5
Dave Baghdanov

フラクタルをアルゴリズムまたはプログラムするものとはみなさないかもしれません。フラクタルは概念です!これは、繰り返される詳細なパターンの数学的概念です。

したがって、以下の図に示すように、さまざまなアプローチを使用して、さまざまな方法でフラクタルを作成できます。

enter image description here

アプローチを選択し、それを実装する方法を調査します。これらの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となる)複雑な型を使用するか、その計算をループに含める必要があります。

3
Jimmy

Javaマンデルブロやその他のフラクタルの例の簡単で理解しやすいコードを次に示します。

http://code.google.com/p/gaima/wiki/VLFImages

BuildFractal.jarをダウンロードしてJavaでテストし、コマンドで実行します:

Java -Xmx1500M -jar BuildFractal.jar 1000 1000デフォルトMANDELBROT

ソースコードは、ダウンロード/探索/編集/展開も無料です。

3
reddev

まあ、シンプルでグラフィカルに魅力的なものは、実際に手をつないで行くことはありません。フラクタルのプログラミングに真剣に取り組んでいる場合は、反復関数システムとそれらのレンダリングで行われた進歩について読むことをお勧めします。

http://flam3.com/flame_draves.pdf

2
Algorias

上記の人々は、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
    }
1
faeophyta

フラクタルを楽しみのために、挑戦としてプログラムすることもあります。あなたはそれらを見つけることができます こちら 。コードはP5.jsライブラリを使用してJavascriptで記述されており、HTMLソースコードから直接読み取ることができます。

私が見た人にとって、アルゴリズムは非常に単純で、コア要素を見つけて、それを何度も繰り返します。私は再帰関数でそれを行いますが、別の方法で行うことができます。

1
2dvisio