c - 缩放 MandelBrot 集

标签 c zooming xlib mandelbrot

我的计算似乎是移动图像而不是缩放图像。不太确定我哪里出错了。我以为我正确地遵循了此处的另一篇文章,但不太正确。

int xPos = ev.xbutton.x;
int yPos = ev.xbutton.y;

double xCenter = (double) ((double) ((double) xPos / X_RESN) * (rmax - rmin)) + rmin;
double yCenter = (double) ((double) ((double) yPos / Y_RESN) * (imax - imin)) + imin;

double pixelFactors[4];

if(ev.xbutton.button == 1) //Left click, zoom in
{
    rmin = (double) xCenter + (rmin + 0.3);
    rmax = (double) xCenter + (rmax - 0.3);
    imin = (double) yCenter + (imin + 0.3);
    imax = (double) yCenter + (imax - 0.3);
}
else if(ev.xbutton.button == 3) //Right click, zoom out
{
    rmin = -2;
    rmax = 2;
    imin = -2;
    imax = 2;
}

最佳答案

你写道:

rmin = (double) xCenter + (rmin + 0.3);
rmax = (double) xCenter + (rmax - 0.3);
imin = (double) yCenter + (imin + 0.3);
imax = (double) yCenter + (imax - 0.3);

那里不应该有一些乘法吗?也许更像是:

rmin = (double) xCenter + (rmin * 0.3);
rmax = (double) xCenter + (rmax * 0.3);
imin = (double) yCenter + (imin * 0.3);
imax = (double) yCenter + (imax * 0.3);

如果您只是想让最小值和最大值更接近,xCenter 和 yCenter 在复平面坐标(即不是像素坐标)中定义图像的中间,我认为这可能是更接近您想要的。

double rspan = rmax - rmin;
double ispan = imax - imin;
rmin = xCenter - (rspan * 0.3);
rmax = xCenter + (rspan * 0.3);
imin = yCenter - (rspan * 0.3);
imax = yCenter + (rspan * 0.3);

请注意不再需要强制转换。

关于c - 缩放 MandelBrot 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16206264/

相关文章:

css - 在 Chrome 上缩放时,图像 Sprite 变得不对齐

javascript - 如何在所有现代浏览器中检测页面缩放级别?

linux - 使用 X11 在 Linux 上获取扫描码而不是键码

c++ - CreateRemoteThread失败,可能目标进程中的lpBaseAddress无效,但它是系统分配的?

c - AVR-GCC 中 undefined reference

c++ - 可移植硬实时 C 或 C++ 原始以太网协议(protocol)库

css - 如何给 div 或 IMG 一个 'minimum size'

c++ - 从 X11 队列中删除额外的公开消息

c - 按住另一个按钮时,XGrabButton 不会捕获点击

自定义 PCI 驱动程序无法探测设备