4

だから私はこの記事を読みました: http://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand しかし、私はステップ 7 で立ち往生しています。JavaScript キャンバスでセットを描いています。

私が必要とするのは、基本的に私が推測する C 値だけです。

for (var y = 0; y < ImageHeight; y++) {
    for (var x = 0; x < ImageWidth; x++) {

        // Pixel-Position for ImageObject
        var xy = (x + y * image.width) * 4;

        // Convert Image-Dimension to a radius of 2
        var xi = ((x / ImageWidth) * 4) - 2;
        var yi = ((y / ImageHeight) * 4) - 2;

        for (var n = 0; n < MaxIterations; n++) {

            // Complex number stuff..?
            z = (xi*xi) + (yi*yi) + c;
            c = 0; // Somethig with z ..?

            if (z < 4) {

                image.data[xy] = inner_color[0];
                image.data[xy+1] = inner_color[1];
                image.data[xy+2] = inner_color[2];
                image.data[xy+3] = Math.round(n * cdiff);

            } else {

                image.data[xy] = outer_color[0];
                image.data[xy+1] = outer_color[1];
                image.data[xy+2] = outer_color[2];
                image.data[xy+3] = Math.round(n * cdiff);

                break;
            }
        }
    }
}

虚数などについてもよく読みましたが、それらの計算方法がよくわかりませんでした。そして、たとえばJavaScriptで論理演算を行うには、とにかくそれらを実数に変換する必要があるため、それらは私には役に立たないようです。

[削除]
URL の末尾にある 2 を削除すると、C++ スニピットを少し書き直した別のバージョンが表示されます。でも、ズーミングはなんとなく変なので、自分で全部書きたいと思います..

マンデルブロ集合作成の基本的な考え方は理解できましたが、前述のように複雑な部分が気になります。もっと簡単な説明はありますか?

4

1 に答える 1

16

最初にこれを理解する必要があります:

z = z^2 + c

分解してみましょう。

zとはどちらcも複素数です (最近の質問で、これを強調するように教えられました。これらに小数桁があり、次のようになります: c=-0.70176-0.3842i)。複素数には「非実数」の部分が含まれる場合があり、適切な項は虚数部分であり、単一の複素数を次の形式で記述します。

(a + bi)これは次と同じです:(a + b*i)

b が 0 の場合、a がありa + 0ia虚数がなければ実数になります。

あなたのリンクは、複素数の最も重要な特性、特にその部の特性について言及していませんi == sqrt(-1)。実数の分野では、負の数の平方根のようなものはありません。ここに複素数が入り、-1 の平方根を持つことができます。i2 の累乗にしましょう: i^2 == -1、魔法!

虚数部 ( i) はユーザーが処理する必要があります (特殊な 2 乗) か、使用するプログラミング言語がそれを処理する Complex 型を提供します。

拡張に戻りますz^2

z == (a+bi)ですので、z^2 == (a+bi)^2そうz^2 == (a^2 + bi^2 + 2*a*bi)です。

これも分解してみましょう:

  • a^2=>これは簡単です、それは実数です
  • bi^2=>トリッキーな部分。これは本当にb^2*i^2です。そして、ここに がありi^2、これはor-1になります。したがって、これも実数です。b^2*-1-b^2
  • 2*a*b*i=>これは部になります

結果:z^2 = (a^2-b^2+2*a*bi)

例 (少し詳細です。ループの最初の繰り返しと考えることができます):

z = (5 + 3i)
z^2 = (5 + 3i)^2
    = (5^2 + 3^2*i^2 + 2*5*3i)
    = (25 + 9i^2 + 30i)
    = (25 + 9*-1 + 30i)
    = (25 - 9 + 30i)
    = (16 + 30i)

複素数の反復と乗算を理解している場合は、マンデルブロ (およびc値) に関するいくつかの単語:

マンデルブロ集合を作成したい場合、上で説明した反復で (たとえば 50 回) 反復しても無限にならない複素平面上の点を実際に探しています。マンデルブロー集合は、通常見られる「マンデルブロ」写真の黒い部分であり、光沢のある色付きの部分ではありません。

ウィキペディアから引用したマンデルボルト集合

通常のワークフローは次のとおりです。

  • 複素平面上の点を選択します。たとえば、(1.01312 + 0.8324i) => これがc!の値になります。
  • 最初の反復の前に (0, 0i) を入れてから、z前に述べたように何度も反復します => z = z^2 + c。はい、点を 2 乗して同じ点を追加しています。これはマンデルブロ集合の非常に重要な属性です。手始めに、これを50回行います。これにより、結果として複素数が得られます。
  • 結果の複素数 (実数または虚数のいずれか) のいずれかの部分が 2 以上である場合、この点は無限大になると想定し、この点はマンデルブロ集合の一部ではないと見なします*。これは、点に色を付ける必要がある場合です (これは、マンデルブロ集合のカラフルな部分です)。複素数の両方の部分が 2 未満である場合、点が無限大になることはないと仮定し (無億回反復しても)、この点をマンデルブロ集合の一部と見なし、その色は黒になります。
  • 繰り返す(次の点を選び、その値をcに入れ、ゼロを入れzて計算する)

*実際には、ポイントがセットの一部であるかどうかを確認するのはもう少し複雑ですが、これはプロトタイプではうまく機能します

于 2012-03-30T11:15:09.173 に答える