首页 > 解决方案 > 如何旋转对象以始终面对鼠标?

问题描述

我正在尝试制作游戏,并且我需要玩家(矩形)始终看着鼠标,我已经找到了一些关于此的页面,但我似乎无法理解数学。主要的:

 g2d.rotate(calculateRotation, x,y);
 g2d.fill(player);
 g2d.rotate(-calculateRotation, x,y);

鼠标监听器:

 int mx = e.getX();
 int mY = e.getY();

float rotation = Math.atan((mouseX-playerX)/(mouseY-playerY)); //<--- I don't know

会是这样吗?

标签: javamouserectanglesdrawing2d

解决方案


你应该使用线性代数——而不是使用正弦和余弦,你使用向量。

如果你有P1 =(x1,y1) (玩家所在的位置)和P2 =(x2,y2) (鼠标指针所在的位置),那么你有向量V =(x2-x1,y2-y1)=( v1,v2),其长度为 v=|V|=sqrt(v1^2+v2^2)。然后你有versor(它是一个长度= 1的向量)M =(v1 / v,v2 / v)=(m1,m2)。

然后,您可以通过映射 (x,y)->(x* m1-y* m2, x* m2+y*m1) 来旋转点,而不是计算角度。

另请参阅https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions

(记住在V=0的情况下要小心)

注意:使用 atan 是可以的,但您需要检查 x 和 y 的符号。如果它们都是负数,您会发现角度错误;如果一个是正的,另一个是负的,你仍然不知道你的箭头是指向 NW 还是 SE。


推荐阅读