【问题标题】:Smooth Zoom with mouse in Mandelbrot set (C)Mandelbrot 集合中的鼠标平滑缩放 (C)
【发布时间】:2017-01-22 22:27:44
【问题描述】:

在过去的几天里,我一直在研究 C Mandelbrot 集程序,我设法让它工作正常,但是,我的最终目标是能够用鼠标平滑地放大集,这就是我还不能做,所以我可能需要一些帮助!

这是我的代码的一部分(嗯,完整的 mandelbrot 函数):

//removed to free space

这是输出的图片: (抱歉,它不是很漂亮,颜色不是我的首要任务,但我一定会在弄清楚缩放后立即处理它们!

Mandelbrot

我想做什么

  • 左键单击 -> 图像中心变为 mouse_x 和 mouse_y。然后,只要按住左键,它就会开始放大
  • 右键单击 -> [...] 只要按住右键,它就会开始缩小
  • move mouse -> 如果当前放大/缩小,图像的中心将移动到鼠标的坐标。否则什么也不会发生。

已经有一个函数可以获取鼠标的位置和按下的按钮

非常感谢您的帮助!

【问题讨论】:

    标签: c zooming fractals mandelbrot


    【解决方案1】:

    可见区域是一个由(Re.min, Im.min)(Re.max, Im.max) 定义的矩形。单击特定点时,可以使用与渲染时相同的映射将鼠标位置映射到点(mouseRe, mouseIm)

    double mouseRe = (double)mouse_x / (WIN_L / (e->Re.max - e->Re.min)) + e->Re.min;
    double mouseIm = (double)mouse_y / (WIN_H / (e->Im.max - e->Im.min)) + e->Im.min;
    

    要放大,想象从(mouseRe, mouseIm) 缩放中心点到可见区域的每个角画一条线,形成一个不平衡的 X。根据缩放量,沿距离的一定比例找到 4 个新点这些线,这些点会给你你的新矩形。例如,如果您要放大 3 倍,请找到从中心点到角落的 1/3 处的点。这将产生一个新的矩形,其边长为原始矩形的 1/3,面积为原来的 1/9。

    为此,您可以定义一个简单的插值函数:

    double interpolate(double start, double end, double interpolation)
    {
        return start + ((end - start) * interpolation);
    }
    

    然后使用函数找到你的新点:

    void applyZoom(t_fractal* e, double mouseRe, double mouseIm, double zoomFactor)
    {
         double interpolation = 1.0 / zoomFactor;
         e->Re.min = interpolate(mouseRe, e->Re.min, interpolation);
         e->Im.min = interpolate(mouseIm, e->Im.min, interpolation);
         e->Re.max = interpolate(mouseRe, e->Re.max, interpolation);
         e->Im.max = interpolate(mouseIm, e->Im.max, interpolation);
    }
    

    根据我的描述,您可能认为您需要找到 8 个值(X 的 4 条腿各有 4 个点,每条 2 维)但实际上只有 4 个唯一值,因为每条边都是轴对齐的。

    为了平滑缩放,请使用略高于 1.0 的缩放系数调用它,例如1.01。要缩小,请传递逆,例如1.0 / 1.01。

    或者,如果您希望在单击鼠标时视图的中心跳转到某个位置,请按上述计算mouseRemouseIm,然后将视图矩形的角偏移这些值之间的差值和视图矩形的中心。您可以在第一次按下鼠标按钮时存储这些值,并在按住鼠标按钮时使用它们进行放大。

    【讨论】:

    • 非常感谢您抽出宝贵时间写出如此出色的答案。 !完美运行。
    • 不客气。顺便说一句,我认为您应该回滚您的编辑,这对于阅读问题的其他人查看您的代码会更有帮助。不用担心它占用太多空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多