如何绘制正确指向屏幕角落图像的线条

时间:2016-02-26 19:36:46

标签: java swing awt

我在每个屏幕边缘都有一些固定的位置图像,我想找到一种能够正确指向它们的方法,我从MouseMoved获得了我的新旧鼠标点以及那些2点和角度我可以绘制一条到达屏幕末端的线但不幸的是我无法在图像上正确地指出该线点

1 个答案:

答案 0 :(得分:1)

您的计划正在尝试做的是:

  1. 找出该线应该具有的角度。
  2. 首先假设线条非常长,以便它穿过矩形的边缘。
  3. 然后在穿越处切断它。
  4. 例如,假设矩形是180乘120,那么你的角度是45º。尺寸越大,为180,因此您在该角度绘制一条长度为180的线:

    Illustration of that situation

    所以你想要切割箭头所在的线。您的newXnewY都在框架之外。根据程序的逻辑,您会看到newX大于1750,因此您将其剪切为180(在我的示例中为最大帧)。并且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的新值可能仍在矩形之外。事实上,新观点是:

    New point that was calculated

    所以现在你要调整Y的值 - 但是你必须要小心,并根据相同的角度将X的值与Y匹配。

    但要注意:这个方法开始时并不是很好。将Math.max(getWidth(), getHeight())作为线的初始长度仅适用于某些点。但是,如果你的观点靠近一个角落而另一个点靠近对角线怎么办?矩形的对角线比其宽度和高度都长。所以你会得到一条太短而且无法到达边缘的线。

    你可以计算对角线而不是max,但也许你应该采用不同的方法:

    1. 计算直线的线性公式(任意直线为y=ax+b)。
    2. 计算x=100x=width-100
    3. 的Y.
    4. 计算y=100y=height-100
    5. 的X.
    6. 现在你有四对X和Y,找出哪一个是正确的。只有两个将在框架内,并且只有一个是在正确的方向。

      实际上,您不需要计算四个点。如果鼠标事件中的原始newX位于oldX的右侧,则仅计算右边缘的公式。左边缘不感兴趣。如果它在左侧,则仅在左边缘计算。如果鼠标事件中的原始newY低于oldY,则仅计算下边缘的公式,如果更高,则仅计算顶边。你最终得到两分。其中只有一个是“合法的”(x和y都在矩形中),你可以使用它。

    7. Calculating from the edges