1. ホーム
  2. theory

フラクタルのプログラミングはどうやるの?

2023-09-17 10:11:22

質問

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

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

プログラミング言語は本当に重要ではありませんが、私はアクションスクリプト、C#、Javaに最も精通している。

フラクタルでググるとたくさんの(複雑な)情報が出てくるのは知っていますが、まずは簡単なアルゴリズムで遊んでみたいと思っています。

基本的なアルゴリズムの改善提案も大歓迎です!あの可愛い色で作るにはどうしたらいいかとか。

どのように解決するのですか?

マンデルブローをプログラミングするのは簡単です。

私のクイック&ダーティコードは以下の通りです(バグがないことは保証できませんが、良いアウトラインです)。

以下はその概要です。 マンデルブロー集合は、複素数格子において、半径 2 の円内に完全に存在します。

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

[new value] = [old-value]^2 + [original-value] の2つを記録しながら

1.) 反復の回数

2.) [new-value]の原点からの距離。

最大反復回数に達したら、終了です。 原点からの距離が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)の矩形領域をスクリーン座標に変換する方法を考えなさい。