我目前正在尝试为我一直在研究的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;
让我们应用一些代数。着色器执行以下转换:
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
覆盖它)。因此,您可能还需要翻转mouseCoord
的y
坐标。
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 最终将继承容器的游标(),因此如果要求一定要让游标出现,则必须手动设置所需的光标。 例如,如果中包含,则可以使用方法将其光标设置为系统的默认值: