如何放大mandelbrot设置

时间:2010-12-10 03:31:17

标签: objective-c mandelbrot

我已经成功实现了wikipedia文章中描述的mandelbrot集,但我不知道如何放大特定部分。这是我正在使用的代码:

+(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的范围内,减少这个数字会缩放,但这根本不起作用。我该如何缩放?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

假设中心是(cx,cy)并且您要显示的长度是(lx,ly),您可以使用以下缩放公式:

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

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

它的作用是首先将像素缩小到单位间隔(0 <= i /宽度<1),然后移动中心(-0.5 <= i /宽度-0.5 <0.5),缩放到所需的尺寸(-0.5 * 1x <=(i /宽度-0.5)* lx <0.5 * 1x)。最后,将它转移到你给出的中心。