78

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

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

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

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

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

4

12 に答える 12

61

マンデルブロのプログラミングは簡単です。
私の簡単なコードを以下に示します (バグがないことは保証されていませんが、概要としては適切です)。

概要は次のとおりです。マンデルブロー集合は、完全に半径 2 の円内にある複合グリッドにあります。

そのため、その長方形の領域内のすべてのポイントをスキャンすることから始めます。各点は複素数 (x + yi) を表します。その複素数を反復します。

[new value] = [old-value]^2 + [original-value]次の 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,2) 長方形領域を画面座標に変換する方法を見つけます。

于 2009-01-08T21:28:31.383 に答える
29

実際、マンデルブロー集合から始めて、それが実際に何であるかを理解する必要があります。

その背後にある考え方は比較的単純です。複素変数の関数から始めます

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、... が有界、つまり無限大にならない定数 C の集合は、マンデルブロ集合 (Wikipedia ページの図の黒い集合) です。

実際には、マンデルブロー集合を描画するには、次のことを行う必要があります。

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

フラクタルに関する驚くべき事実は、簡単で一見無害な要件から非常に複雑な集合 (特に、マンデルブロ集合の最前線) を取得する方法です。

楽しみ!

于 2009-01-08T21:29:13.440 に答える
10

複素数が頭を悩ませる場合、L-システムを使用して定式化できる幅広いフラクタルがあります。これにはいくつかのレイヤーの相互作用が必要ですが、それぞれが興味深いものです。

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

次に、L-システムを実行するためのレイヤーが必要です。L-systems はPost-systemsSemi-Thue systemsに関連しており、virii のように Turing Completeness の境界をまたいでいます。コンセプトは文字列書き換えです。これは、マクロ展開として、または再帰をバインドするための追加のコントロールを備えたプロシージャ セットとして実装できます。マクロ展開を使用する場合 (以下の例のように)、シンボルをタートル コマンドにマップするためのプロシージャ セットと、エンコードされたタートル プログラムを実行するために文字列または配列を反復処理するためのプロシージャが必要です。境界再帰手続きセット (例: ) の場合、タートル コマンドを手続きに組み込み、各手続きに再帰レベルのチェックを追加するか、ハンドラー関数に分解します。

これは、マクロ展開と非常に簡略化された一連のタートル コマンドを使用した PostScript のピタゴラスの木の例です。Python と Mathematica の例については、コード ゴルフ チャレンジを参照してください。

ps l-system ピタゴラスの木 luser-droog

于 2012-09-18T20:39:04.300 に答える
8

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

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

于 2009-01-08T21:28:59.930 に答える
6

学ぶべきもう一つの優れたフラクタルは、シェルピンスキーの三角フラクタルです。

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

ランダムな動きはランダムな結果を生み出すと思うかもしれませんが、実際にはそうではありません。

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

于 2009-01-08T22:12:28.953 に答える
6

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

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.

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

素敵な色が必要な場合は、最後に使用された変換に応じて色を変更します。

于 2009-08-07T09:11:49.363 に答える
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);
}
于 2009-01-08T21:58:46.440 に答える
3

マンデルブロー集合は、関数がオーバーフローするまで繰り返し評価し (定義された制限)、オーバーフローするのにかかった時間をチェックすることによって生成されます。

擬似コード:

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) が得られます。複合型を使用するか、その計算をループに含める必要があります。

于 2009-01-08T21:23:22.673 に答える
2

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

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

于 2015-12-28T10:01:52.790 に答える
1

上記の人々は、シェルピンスキーとコッホの中間点を見つけることを使用しています。形状をコピーし、スケーリングし、変換して「フラクタル」効果を実現することをお勧めします。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
    }
于 2012-09-29T20:01:59.740 に答える