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

如何在Mandelbrot Set中放大光标点?

姜华翰
2023-03-14

我目前正在尝试为我一直在研究的Mandelbrot Set代码实现缩放功能。这个想法是放大/缩小我左/右键单击的地方。到目前为止,每当我点击屏幕,分形确实会放大。问题是分形不是在原点呈现的——换句话说,它没有在我想要的点上放大。我希望通过这里,我可以获得代码审查和概念上的理解,了解如何放大一个点。

以下是我在使用转义算法之前如何转换像素坐标的:

MandelBrot.碎片

vec2 normalizedFragPos = (gl_FragCoord.xy/windowSize); //normalize fragment position

dvec2 scaledFragPos = normalizedFragPos*aspectRatio;

scaledFragPos -= aspectRatio/2; //Render the fractal at center of window

scaledFragPos /= scale; //Factor to zoom in or out coordinates.

scaledFragPos -= translation; //Translate coordinate
//Escape Algorithm Below

在我的左键点击手柄上,我认为应该将光标位置转换为与Mandelbrot范围相同的坐标范围。所以我基本上做了与片段着色器相同的事情:

窗cpp

float x_coord{ float(GET_X_LPARAM(informaton_long))/size.x }; // normalized mouse x-coordinate
float y_coord{ float(GET_Y_LPARAM(informaton_long))/size.y }; // normalized mouse y-coordinate

x_coord *= aspectRatio[0]; //move point based of relative position to length of window.
y_coord *= aspectRatio[1]; //move point based of relative position to width of window.
x_coord /= scale; //Scale point to match previous zoom factor
y_coord /= scale; //Scale point to match previous zoom factor
translation[0] = x_coord;
translation[1] = y_coord;
//increment scale
scale += .15f;

共有1个答案

商振
2023-03-14

让我们应用一些代数。着色器执行以下转换:

mandelbrotCoord = aspectRatio * (gl_FragCoord / windowSize - 0.5) / scale - translation

当我们放大mouseCood时,我们希望更改比例并调整翻译,使鼠标下的madelbrotCood保持不变。为此,我们首先使用旧的刻度计算鼠标下的mandelbrotCood

mandelbrotCoord = aspectRatio * (mouseCoord / windowSize - 0.5) / scale - translation

然后更改比例(顺便说一句,应按指数变化):

scale *= 1.1;

然后求解新的翻译:

translation = aspectRatio * (mouseCoord / windowSize - 0.5) / scale - mandelbrotCoord

还请注意,系统可能会报告鼠标坐标,坐标向下增加y,而OpenGL的窗口y坐标向上增加(除非使用glClipControl覆盖它)。因此,您可能还需要翻转mouseCoordy坐标。

mouseCoord[1] = windowSize[1] - mouseCoord[1];

为了得到最好的结果,我还将调整鼠标坐标在像素的中间(0.5,0.5)。

把它们都放在一起:

float mouseCoord[] = {
    GET_X_LPARAM(informaton_long) + 0.5,
    GET_Y_LPARAM(informaton_long) + 0.5
};
mouseCoord[1] = size[1] - mouseCoord[1];

float anchor[] = {
    aspectRatio[0] * (mouseCoord[0] / size[0] - 0.5) / scale - translation[0],
    aspectRatio[1] * (mouseCoord[1] / size[1] - 0.5) / scale - translation[1]
};

scale *= 1.1;

translation[0] = aspectRatio[0] * (mouseCoord[0] / size[0] - 0.5) / scale - anchor[0];
translation[1] = aspectRatio[1] * (mouseCoord[1] / size[1] - 0.5) / scale - anchor[1];

注意:上面的一些数学可能会被取消。然而,如果你想实现一个合适的平底锅

 类似资料:
  • 问题内容: 我在JList中有一个单词列表。每次将鼠标光标指向一个单词时,我都希望光标变为手形光标。现在我的问题是该怎么做? 有人可以帮我解决这个问题吗? 问题答案: 在JList上使用MouseMotionListener来检测鼠标何时输入,然后调用将其转换为。 样例代码:

  • 例如,我在VS Code中的一行中有一行很长的文本(让我们假设下面给出的示例很长)。 起初,我将光标放在字符之后。(在下面的示例中,光标由字符表示) 然后,我想在当前光标的每N个字符后添加更多的光标。在这种情况下,N等于8,我想这样做两次,再添加两个光标,如下面的示例所示。 因此,在我按下键盘上的以下键序列后,在这种情况下,这些键序列是,我应该能够得到这些最终结果。 在我取消选择光标后,我应该得到

  • 问题内容: 我遇到了一些我无法解决的问题…我正在编写带有JList的Swing Java应用程序,该JList可以接受拖放操作。我想在通过Java应用程序从系统中拖动文件或文件夹时更改光标。 问题答案: 我自己找到了……不过感谢克林顿的回答。这是我使用的: 首先创建JList …大家都知道该怎么做…然后添加了setDropTarget:

  • 使用Material CDK库中的拖放行为,我试图在拖动元素时更改光标。 例如,在此StackBlitz中,光标悬停时为。我希望它在拖动时变为抓取。这方面的一个例子是在Google工作表中抓取一行时发生的情况: 读取样式化拖放组件的留档,看起来向这个类添加游标属性应该可以做到这一点: . cdk-drop-list-draging:当用户拖动项目时添加到cdkDropList的类。 代码如下所示:

  • 问题内容: 我正在尝试在javaFX中创建自定义光标。这是我的代码: Windows 8.1的游标创建无效吗? 问题答案: 检出ImageCursor.getBestSize()方法和ImageCursor.getMaximumColors()并查看它们返回的内容,然后尝试匹配最佳大小和最大颜色的自定义光标图像。对于Windows 8.1,这很可能是32x32的光标。 这是来自javadoc 的引

  • 问题内容: 是否有隐藏光标的方法(除了使用透明图像作为光标以外)? 问题答案: 似乎该类没有开始的“空白”游标,因此可以使用该方法定义一个新的“空白”游标。 这是我尝试过的一种可行的方法: 编辑 关于结尾处没有游标的所有注释,似乎包含在中的s 最终将继承容器的游标(),因此如果要求一定要让游标出现,则必须手动设置所需的光标。 例如,如果中包含,则可以使用方法将其光标设置为系统的默认值: