1

「フラクタル内をズームすればするほど、実行する必要のある反復が増える」という引用をどこかで読んだことを理解するために、ここで頭を悩ませています。

これまでのところ、そのことを証明する数学/学術論文を見つけることができませんでした。http://warp.povusers.org/Mandelbrot/から取得した、マンデルブロ集合を計算する小さなコードも見つけること ができましたが、ズームが反復にどのように影響するかを理解できませんでした。

double MinRe = -2.0;
double MaxRe = 1.0;
double MinIm = -1.2;
double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
unsigned MaxIterations = 30;

for(unsigned y=0; y<ImageHeight; ++y)
{
    double c_im = MaxIm - y*Im_factor;
    for(unsigned x=0; x<ImageWidth; ++x)
    {
        double c_re = MinRe + x*Re_factor;

        double Z_re = c_re, Z_im = c_im;
        bool isInside = true;
        for(unsigned n=0; n<MaxIterations; ++n)
        {
            double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
            if(Z_re2 + Z_im2 > 4)
            {
                isInside = false;
                break;
            }
            Z_im = 2*Z_re*Z_im + c_im;
            Z_re = Z_re2 - Z_im2 + c_re;
        }
        if(isInside) { putpixel(x, y); }
    }
}

ありがとう!

4

2 に答える 2

1

これは科学的な答えではなく、常識的な答えです。理論的には、ポイントがマンデルブロ集合に属するかどうかを判断するには、無限に反復し、値が無限に達するかどうかを確認する必要があります。これは実際には役に立たないので、次のように仮定します。

  1. 50回だけ繰り返します
  2. 反復値が2より大きくなることを確認します

マンデルブロ集合にズームインすると、2番目の仮定は有効なままです。ただし、ズームとは、ポイント座標の重要な小数桁を増やすことを意味します。

この値を何度も繰り返すことから始めて(0.4,-0.2i). 、使用される桁を増やしますが、有効桁を失うことはないとします。ポイント座標がそのように見える(0.00000000045233452235, -0.00000000000943452634626i)場合:そのポイントがセット内にあるかどうかを確認するには、その反復が2に達するかどうかを確認するために、さらに多くの反復が必要です。もちろん、ある種のFloatタイプを使用すると、有効数字が失われます。ズームレベルがあり、任意精度のライブラリに切り替える必要があります。

試してみるのがあなたの親友です:-)低反復と高反復のセットを計算し、最初の画像から2番目の画像を減算します。常にエッジ(黒いピクセルが色付きのピクセルと出会う場所)で変化が見られますが、ズームレベルが高い場合(つまり、ポイント座標に多くの小数桁がある場合)、異なる画像が得られます。

于 2012-06-04T14:41:59.987 に答える
1

ズームが反復にどのように影響するかを尋ねましたが、私の典型的なズームと反復の比率は、サイズの9分の1にズームインすると、反復が1.7増加するというものです。もちろん、サイズの9分の1は、幅と高さの両方が3で割られることを意味します。

これをより一般的にするために、私は実際にこれをコードで使用しています

Complex middle = << calculate from click in image >>
int zoomfactor = 3;
width = width / zoomfactor;
maxiter = (int)(maxiter * Math.Sqrt(zoomfactor));
minimum = new Complex(middle.Real - width, middle.Imaginary - width);
maximum = new Complex(middle.Real + width, middle.Imaginary + width);

ズームと反復の間のこの関係はかなりうまく機能していることがわかります。フラクタルの詳細は、反復にあまりにも速く夢中になることなく、深いズームでもうまくいきます。

自分の好みに応じてどれだけ速くズームしたいのか、私はズームファクター3が好きですが、何でも構いません。重要なことは、ズームファクターと相互作用の増加との関係を維持する必要があるということです。

于 2012-10-06T03:21:23.017 に答える