如何缩放Mandelbrot集合

5

我已经按照维基百科文章的描述成功地实现了曼德博集合,但我不知道如何缩放到特定的部分。这是我正在使用的代码:

+(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 < x < 2, -2 < y < 2 范围内。不确定您所提供的数字是什么意思。 - jcomeau_ictx
对于“无尽缩放”,我相信使用了分形算法本身的某些属性。 - user166390
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)。最后,将其移动到给定的中心点。

谢谢!我发现你的回答很有用,因为我也遇到了需要扩展Mandelbrot集合的需求。但是,我可以问一下,在这种情况下,x0和y0是什么意思?我不熟悉C语言。 - Robert Garza-Altuna

2

我正在创建一个大集合,并希望它更快,所以将其减少到15...之前是1000。 - Nippysaurus
你缩放得越多,就需要更多的迭代来看到点之间的差异。迭代太少,你只会看到一种颜色。在更高的缩放级别下,你需要更多的迭代来显示细节。 - Graham Perks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接