当前位置: 首页 > 知识库问答 >
问题:

在Mandelbrot集合中使用鼠标平滑缩放(C)

洪季萌
2023-03-14

在过去的几天里,我一直在开发C Mandelbrot集合程序,我设法让它工作得很好,然而,我的最终目标是能够用我的鼠标平稳地放大集合,这是我还没有做到的,所以我可能需要一些帮助!

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

//removed to free space

这是输出的图片:(抱歉,它不是很漂亮,颜色不是我的首要任务,但我一定会尽快处理它们,只要我弄清楚变焦!)

曼德布罗特

我希望能够做到的是:

  • 左键单击-

(已经有一个函数,获取鼠标的位置和按钮被按下)

非常感谢你的帮助!

共有1个答案

夏锐藻
2023-03-14

可见区域是由(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/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个值(4点为X的4条腿,每个2维),但实际上只有4个唯一的值,因为每个边都是轴对齐的。

要实现平滑的缩放,请使用略高于1.0的缩放因子调用它。1.01。要缩小,请通过反转例如。1.0/1.01。

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

 类似资料:
  • 我在Java中编码了一个Mandelbrot集分形,并包含了平移和放大分形的能力。唯一的问题是,当我平移图像并试图放大时,它看起来好像试图放大中心并平移一点。平移和缩放不是真正的平移或缩放,而是对分形的重新计算,看起来像是平移或缩放。 这是我的代码。 我能告诉用户在哪里可以让相机更精确地缩放吗? 先谢谢你。 编辑:图片对于任何想知道这个程序将呈现什么。

  • 我有一套mandelbrot电视机,我想放大。“缩放曼德拉”和“缩放曼德拉”是围绕曼德拉坐标计算的。原始的mandelbrot以real=-0.6和im=0.4为中心,real和im的大小均为2。 我希望能够点击图像中的一个点,并计算一个新的点,放大该点 包含它的窗口是800x800px,所以我想这将使右下角的单击等于真实=0.4和im=-0.6的中心,左上角的单击为真实=-1.6和im=1.4

  • 因此,在学习C的一个步骤中,我决定尝试使用CImg实现mandelbrot集。这是我的程序: 我设法画出经典的曼德尔布洛特形状,但后来我试图实现平滑,以摆脱丑陋的带状。但我不能让它真正工作。 说真的,我不知道我在做什么,因为数学很难。 当保存图像时,我也会收到这个警告 所以很明显我有一个溢出的地方,但我真的不知道在哪里。 如果有人能帮助我,解释我在做什么,并指出我所做的所有错误的事情,但用一种简单

  • 我有一些路径绘制到WPF中的屏幕。使用的坐标非常小,所以它们被制作成用一个视图框填充屏幕。我现在正在尝试实现平移和缩放功能。我希望能够缩放到鼠标与ui相关的任何地方(即缩放的屏幕中心等于鼠标坐标)。当前的结果是,缩放时屏幕的中心不能反映UI上鼠标的准确位置。 视图模型 查看后面的代码

  • 我有一个自定义图表,我使用以下代码缩放它: 我注意到当我用鼠标滚轮滚动图表时,我不能缩放鼠标指向的图表。相反,图表会向左或向右缩放。

  • 只要缩放开始后鼠标不移动,我就可以在Mandelbrot集合上指向缩放。我尝试过计算一个标准化的delta(新坐标-旧坐标)*(oldzoom),但结果是图像似乎跳转到一个新位置。我以前见过这个问题。我在这里更加挣扎,因为我必须以某种方式将鼠标位置的增量转换回Mandelbrot集合的-2,2坐标空间。 这是我的密码。重要的是GetZoomPoint方法,然后是定义x0和y0的代码行。此外,我还使