如何绘制一条正确指向屏幕角落图像的线
How to draw a line that points correctly at images at the corners of the screen
我在每个屏幕边缘都有一些固定位置的图像,我想找到一种能够正确指向它们的方法,我从 MouseMoved 以及这 2 个点和角度获得了我的旧鼠标点和新鼠标点我可以画一条线到达屏幕的尽头,但不幸的是我无法在图像上正确地指向该线
你的程序试图做的是:
- 找出直线应该具有的角度。
- 首先假设这条线会很长,以至于它会穿过矩形的边缘。
- 然后在交叉点切断。
例如,假设矩形为 180 x 120,并且您的角度为 45º。尺寸中较大的一个是 180,因此您以该角度绘制一条长度为 180 的线:
所以你想剪掉箭头所在的线。您的 newX
和 newY
都在框架之外。根据您的程序逻辑,您看到 newX
大于 1750,因此您将其削减为 180(在我的示例中为最大帧 y)。而 newY
的值大于 850,所以你将它裁减为 120(在我的示例中矩形的最大 Y)。
这意味着几乎总是,您最终会在 (180,120) 而不是箭头所在的位置结束行。这是因为你只调整了一个坐标,但是在继续之前没有在直线上找到对应的Y。
基本上,当你将newX
缩减到getWidth() - 100
时,你还需要找到与之相伴且在同一行的Y。所以你需要重新计算Y。而不是:
if (newX > 1720)
{
newX = getWidth() - 100;
}
你需要
if (newX > 1720)
{
newX = getWidth() - 100;
newY = Math.round(oldY + (newX - oldX)*Math.tan(angle));
}
newY
的新值可能仍在矩形之外。其实新点是这样的:
所以现在您将调整 Y 的值 - 但同样,您必须小心,并根据相同的角度将 X 的值与那个 Y 匹配。
但要注意:该方法一开始并不是很好。以 Math.max(getWidth(), getHeight())
作为直线的初始长度仅适用于某些点。但是如果你的点在一个角附近而另一个点在对角附近怎么办?矩形的对角线比它的宽度和高度都长。所以你会得到一条太短的线,不会到达边缘。
您可以计算对角线而不是 max
,但也许您应该采用不同的方法:
计算直线的线性公式(任意直线都是
)。
计算 x=100
和 x=width-100
的 Y
计算 y=100
和 y=height-100
的 X
现在你有四对X和Y,找出其中哪一对是正确的。只有两个将在框架内,其中只有一个在正确的方向。
其实不用计算四点。如果鼠标事件的原始 newX
在 oldX
的右侧,则只计算右边缘的公式。你对左边不感兴趣。如果在左边,只计算左边。如果鼠标事件的原始 newY
低于 oldY
,则只计算下边缘的公式,如果更高,则仅计算上边缘。你最终会得到两点。其中只有一个是“合法的”(x 和 y 都在矩形中),您使用它。
我在每个屏幕边缘都有一些固定位置的图像,我想找到一种能够正确指向它们的方法,我从 MouseMoved 以及这 2 个点和角度获得了我的旧鼠标点和新鼠标点我可以画一条线到达屏幕的尽头,但不幸的是我无法在图像上正确地指向该线
你的程序试图做的是:
- 找出直线应该具有的角度。
- 首先假设这条线会很长,以至于它会穿过矩形的边缘。
- 然后在交叉点切断。
例如,假设矩形为 180 x 120,并且您的角度为 45º。尺寸中较大的一个是 180,因此您以该角度绘制一条长度为 180 的线:
所以你想剪掉箭头所在的线。您的 newX
和 newY
都在框架之外。根据您的程序逻辑,您看到 newX
大于 1750,因此您将其削减为 180(在我的示例中为最大帧 y)。而 newY
的值大于 850,所以你将它裁减为 120(在我的示例中矩形的最大 Y)。
这意味着几乎总是,您最终会在 (180,120) 而不是箭头所在的位置结束行。这是因为你只调整了一个坐标,但是在继续之前没有在直线上找到对应的Y。
基本上,当你将newX
缩减到getWidth() - 100
时,你还需要找到与之相伴且在同一行的Y。所以你需要重新计算Y。而不是:
if (newX > 1720)
{
newX = getWidth() - 100;
}
你需要
if (newX > 1720)
{
newX = getWidth() - 100;
newY = Math.round(oldY + (newX - oldX)*Math.tan(angle));
}
newY
的新值可能仍在矩形之外。其实新点是这样的:
所以现在您将调整 Y 的值 - 但同样,您必须小心,并根据相同的角度将 X 的值与那个 Y 匹配。
但要注意:该方法一开始并不是很好。以 Math.max(getWidth(), getHeight())
作为直线的初始长度仅适用于某些点。但是如果你的点在一个角附近而另一个点在对角附近怎么办?矩形的对角线比它的宽度和高度都长。所以你会得到一条太短的线,不会到达边缘。
您可以计算对角线而不是 max
,但也许您应该采用不同的方法:
计算直线的线性公式(任意直线都是
)。
计算
的 Yx=100
和x=width-100
计算
的 Xy=100
和y=height-100
现在你有四对X和Y,找出其中哪一对是正确的。只有两个将在框架内,其中只有一个在正确的方向。
其实不用计算四点。如果鼠标事件的原始
newX
在oldX
的右侧,则只计算右边缘的公式。你对左边不感兴趣。如果在左边,只计算左边。如果鼠标事件的原始newY
低于oldY
,则只计算下边缘的公式,如果更高,则仅计算上边缘。你最终会得到两点。其中只有一个是“合法的”(x 和 y 都在矩形中),您使用它。