我有一个 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
我计算的是:
为真正的值(value)
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 的缩放级别,这将不起作用。我是否遗漏了有关缩放级别坐标的内容?
最佳答案
我在放大我的 C# Mandelbrot 时遇到了类似的问题。我的解决方案是以百分比计算从点击位置到中心的差异,将其乘以中心的最大单位(宽度/缩放* 0.5,宽度=高度,缩放= n * 100)并将其添加到您当前的值(value)。所以我的代码是这样的(假设我从点击中获得 sx
和 sy
作为参数):
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;
这将为您提供必须通过算法的坐标,以便它呈现所选地点。
关于c++ - 确定 mandelbrot 缩放的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156152/