确定mandelbrot缩放的坐标

时间:2013-04-22 20:29:56

标签: c++ math zoom mandelbrot

我有一个我要放大的mandelbrot设置.mandelbrot是围绕中心坐标,mandelbrot大小和缩放级别计算的。原来的曼德尔布罗特以中心为中心 real = -0.6和im = 0.4,在real和im中都有2的大小。

我希望能够点击图片中的某个点并计算一个新点,在该点附近放大

包含它的窗口是800x800px,所以我认为这会使右下角的点击等于real = 0.4和im = -0.6的中心,并且左上角的点击是真实的= - 1.6和im = 1.4

我用以下方法计算:
对于真正的价值
800a + b = 0.4 => A = 0.0025
0a + b = -1.6 => B = -1.6

对于虚数值
800c + d = -0.6 => C = -0.0025
0c + d = 1.4 => d = 1.4

然而,如果我继续使用2的mandelbrot大小和2的缩放级别,这不起作用。我是否遗漏了与缩放级别相关的坐标?

1 个答案:

答案 0 :(得分:2)

我在放大C#Mandelbrot方面遇到了类似的问题。我的解决方案是计算从点击位置到中心的百分比差异,将其乘以中心的最大单位(宽度/缩放* 0.5,宽度=高度,缩放= n * 100)并将其添加到当前值。所以我的代码是这样的(假设我从点击中得到sxsy作为参数:

        double[] o = new double[2];

        double digressLRUD = width / zoom * 0.5; //max way up or down from the center in coordinates

        double shiftCenterCursor_X = sx - width/2.0; //shift of cursor to center
        double shiftCenterCursor_X_percentage = shiftCenterCursor_X / width/2.0; //shift in percentage
        o[0] = x + digressLRUD * shiftCenterCursor_X_percentage; //new position

        double shiftCenterCursor_Y = sy - width/2.0;
        double shiftCenterCursor_Y_percentage = shiftCenterCursor_Y / width/2.0;
        o[1] = y - digressLRUD * shiftCenterCursor_Y_percentage;

这样可行,但你必须更新缩放(我用它来乘以2)。

另一点是将所选中心移动到图像的中心。我是通过一些计算来做到的:

        double maxRe = width / zoom;
        double centerRe = reC - maxRe * 0.5;

        double maxIm = height / zoom;
        double centerIm = -imC - maxIm * 0.5;

这将为您提供传递算法所需的坐标,以便渲染选定的位置。