0

我有一个想要放大的 mandelbrot 集。mandelbrot 是围绕中心坐标、mandelbrot 大小和缩放级别计算的。原始 mandelbrot 以 real=-0.6 和 im=0.4 为中心,real 和 im 的大小均为 2。

我希望能够单击图像中的一个点并计算一个新的点,并在该点周围放大

包含它的窗口是800x800px,所以我想这会使右下角的点击等于real=0.4和im=-0.6的中心,左上角的点击是real=-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 的缩放级别,这将不起作用。我是否遗漏了有关缩放级别坐标的内容?

4

1 回答 1

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;

这将为您带来必须通过算法的坐标,以便渲染选定的位置。

于 2013-04-27T15:50:33.233 回答