Java 2D:瞄准鼠标/三角形比例

Java 2D:瞄准鼠标/三角形比例,java,geometry,Java,Geometry,假设xMouse、yMouse、xPlayer、yPlayer和length都是整数。鼠标的位置就是鼠标光标所在的位置,而玩家的位置显然就是玩家所在的位置。我想让玩家瞄准目标,但我不想使用图形2D。我想用g.drawLine从玩家身上划出一条线,大约向前20个单位,瞄准目标。使用三角形比例定理,我应该能够使用以下比例瞄准玩家: (20 / dist) = (xCoord / xMouse - xPlayer) //Where xCoord is the x pixels. The above w

假设xMouse、yMouse、xPlayer、yPlayer和length都是整数。鼠标的位置就是鼠标光标所在的位置,而玩家的位置显然就是玩家所在的位置。我想让玩家瞄准目标,但我不想使用图形2D。我想用
g.drawLine
从玩家身上划出一条线,大约向前20个单位,瞄准目标。使用三角形比例定理,我应该能够使用以下比例瞄准玩家:

(20 / dist) = (xCoord / xMouse - xPlayer)
//Where xCoord is the x pixels. The above would be the similar for the y axis.
可写为:

xCoord = ((xCoord - xPlayer) * 20) / dist(xMouse, xPlayer);
但在我的情况下,这是可行的。当我对y轴也这样做并用fillOval绘制这个点(xCoord,yCoord)时,我得到了一个“调试”圆(0,0),当鼠标移动时它会四处移动。因为我使用了
xCoord-xPlayer
,所以它应该可以工作(在我看来)。此外,这不仅是奇怪的,而且距离鼠标和玩家的距离也决定了该圆从(0,0)到(0)的距离。但它应该是恒定的

如果你能帮我找出我做错了什么,那就太好了。非常感谢。用下图中的简单几何图形应该很容易,但就我个人而言,我无法理解


我将此代码用于一个小游戏,但如果您将速度更改为您的距离,则应该可以使用

   int angle = Math.toDegrees(Math.atan2(target.x - x, target.y - y));
   this.position.x += speed * Math.sin(angle);
   this.position.z += speed * Math.cos(angle);

让我们一步一步地计算。
从播放器到鼠标的向量为:
V=(Vx,Vy)=(xMouse xPlayer,yMouse yPlayer)

长度:
VLen=Sqrt((xMouse xPlayer)^2+(yMouse yPlayer)^2)//使用Math.Hypot(如果可用)

单位(标准化)向量:
uV=(uVx,uVy)=(Vx/Vlen,Vy/Vlen)

从播放器到鼠标的向量,长度为20:
V20=20*uV=(20*Vx/Vlen,20*Vy/Vlen)

最后的坐标是:

xCoord = xPlayer + 20 * Vx/Vlen
yCoord = yPlayer + 20 * Vy/Vlen