4

ウィキペディアの記事で説明されているようにマンデルブロ集合を正常に実装しましたが、特定のセクションにズームインする方法がわかりません。これは私が使用しているコードです:

+(void)createSetWithWidth:(int)width Height:(int)height Thing:(void(^)(int, int, int, int))thing
{   
    for (int i = 0; i < height; ++i)
    for (int j = 0; j < width; ++j)
    {
        double x0 = ((4.0f * (i - (height / 2))) / (height)) - 0.0f;
        double y0 = ((4.0f * (j - (width / 2))) / (width)) + 0.0f;
        double x = 0.0f;
        double y = 0.0f;

        int iteration = 0;
        int max_iteration = 15;

        while ((((x * x) + (y * y)) <= 4.0f) && (iteration < max_iteration))
        {
            double xtemp = ((x * x) - (y * y)) + x0;
            y = ((2.0f * x) * y) + y0;
            x = xtemp;
            iteration += 1;
        }

        thing(j, i, iteration, max_iteration);
    }
}

x0は-2.5〜1の範囲にあり、y0は-1〜1の範囲にある必要があり、その数を減らすとズームするというのが私の理解でしたが、実際にはまったく機能しませんでした。どうすればズームできますか?

4

2 に答える 2

5

中心が(cx、cy)で、表示する長さが(lx、ly)であるとすると、次のスケーリング式を使用できます。

x0 = cx +(i / width-0.5)* lx;

y0 = cy +(j / width-0.5)* ly;

まず、ピクセルを単位間隔(0 <= i / width <1)に縮小し、次に中心をシフト(-0.5 <= i / width-0.5 <0.5)し、目的の寸法に拡大します( -0.5 * lx <=(i / width-0.5)* lx <0.5 * lx)。最後に、指定した中心に移動します。

于 2010-12-10T04:14:55.377 に答える
2

まず、max_iterationが15の場合、詳細はあまりわかりません。私の場合、ベースラインとしてポイントごとに1000回の反復があり、実際に遅くなって待つことができなくなる前に、約8000回の反復に進むことができます。

これは役立つかもしれません:http://jc.unternet.net/src/java/com/jcomeau/Mandelbrot.java

これも:http ://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand

于 2010-12-10T03:47:30.893 に答える