Java Swing - 计算鼠标位置与屏幕中心的夹角
Java Swing - Calculating what angle the mouse position is to the center of the screen
我正在使用 Java Swing 制作 2D 俯视图射击游戏。我想计算鼠标指针相对于屏幕中心的角度,以便我的一些 Sprites 可以看向指针,这样我就可以创建由角度和速度描述的射弹。另外,如果指针在屏幕中间正上方,我希望我的角度为 0°,如果向右笔直,则为 90°,如果笔直低于 180°,向左笔直为 270°。
我做了一个函数来计算这个:
public static float calculateMouseToPlayerAngle(float x, float y){
float mouseX = (float) MouseInfo.getPointerInfo().getLocation().getX();
float mouseY = (float)MouseInfo.getPointerInfo().getLocation().getY();
float hypotenuse = (float) Point2D.distance(mouseX, mouseY, x, y);
return (float)(Math.acos(Math.abs(mouseY-y)/hypotenuse)*(180/Math.PI));
}
其背后的想法是,我计算斜边的长度,然后计算与所讨论的角相对的边的长度。 2 的分数应该是我的角度的 cos
,所以取该结果的 arc cos
然后乘以 180/Pi 应该得到以度为单位的角度。这确实适用于上方和右侧,但在 returns 0 正下方和左 returns 90 正下方。这意味着我目前有 2 个问题,我的输出域仅为 [0,90]而不是 [0,360) 并且它通过 y(高度)轴镜像。我哪里搞砸了?
你可以这样做。
- 对于
500x500
的 window 大小,左上角位于 0,0
点,右下角位于 500,500
.
- 切线是
Y
相对于两点 X
变化的变化。也称为斜率,它是特定角度的 sin
与 cos
的比率。要找到该角度,可以使用 arctan
(Math.atan
或 Math.atan2
)。第二种方法有两个参数并在下面使用。
BiFunction<Point2D, Point2D, Double> angle = (c,
m) -> (Math.toDegrees(Math.atan2(c.getY() - m.getY(),
c.getX() - m.getX())) + 270)%360;
BiFunction<Point2D, Point2D, Double> distance = (c,
m) -> Math.hypot(c.getY() - m.getY(),
c.getX() - m.getX());
int screenWidth = 500;
int screenHeight = 500;
int ctrY = screenHeight/2;
int ctrX = screenWidth/2;
Point2D center = new Point2D.Double(ctrX,ctrY );
Point2D mouse = new Point2D.Double(ctrX, ctrY-100);
double straightAbove = angle.apply(center, mouse);
System.out.println("StraightAbove: " + straightAbove);
mouse = new Point2D.Double(ctrX+100, ctrY);
double straightRight = angle.apply(center, mouse);
System.out.println("StraightRight: " + straightRight);
mouse = new Point2D.Double(ctrX, ctrY+100);
double straightBelow = angle.apply(center, mouse);
System.out.println("StraightBelow: " + straightBelow);
mouse = new Point2D.Double(ctrX-100, ctrY);
double straightLeft = angle.apply(center, mouse);
System.out.println("Straightleft: " + straightLeft);
打印
StraightAbove: 0.0
StraightRight: 90.0
StraightBelow: 180.0
Straightleft: 270.0
我将弧度输出从 Math.atan2
转换为度数。对于您的应用程序,将它们保留为弧度可能更方便。
这里有一个类似的Function
使用Math.hypot
求距离
BiFunction<Point2D, Point2D, Double> distance = (c,m) ->
Math.hypot(c.getY() - m.getY(),
c.getX() - m.getX());
我正在使用 Java Swing 制作 2D 俯视图射击游戏。我想计算鼠标指针相对于屏幕中心的角度,以便我的一些 Sprites 可以看向指针,这样我就可以创建由角度和速度描述的射弹。另外,如果指针在屏幕中间正上方,我希望我的角度为 0°,如果向右笔直,则为 90°,如果笔直低于 180°,向左笔直为 270°。
我做了一个函数来计算这个:
public static float calculateMouseToPlayerAngle(float x, float y){
float mouseX = (float) MouseInfo.getPointerInfo().getLocation().getX();
float mouseY = (float)MouseInfo.getPointerInfo().getLocation().getY();
float hypotenuse = (float) Point2D.distance(mouseX, mouseY, x, y);
return (float)(Math.acos(Math.abs(mouseY-y)/hypotenuse)*(180/Math.PI));
}
其背后的想法是,我计算斜边的长度,然后计算与所讨论的角相对的边的长度。 2 的分数应该是我的角度的 cos
,所以取该结果的 arc cos
然后乘以 180/Pi 应该得到以度为单位的角度。这确实适用于上方和右侧,但在 returns 0 正下方和左 returns 90 正下方。这意味着我目前有 2 个问题,我的输出域仅为 [0,90]而不是 [0,360) 并且它通过 y(高度)轴镜像。我哪里搞砸了?
你可以这样做。
- 对于
500x500
的 window 大小,左上角位于0,0
点,右下角位于500,500
. - 切线是
Y
相对于两点X
变化的变化。也称为斜率,它是特定角度的sin
与cos
的比率。要找到该角度,可以使用arctan
(Math.atan
或Math.atan2
)。第二种方法有两个参数并在下面使用。
BiFunction<Point2D, Point2D, Double> angle = (c,
m) -> (Math.toDegrees(Math.atan2(c.getY() - m.getY(),
c.getX() - m.getX())) + 270)%360;
BiFunction<Point2D, Point2D, Double> distance = (c,
m) -> Math.hypot(c.getY() - m.getY(),
c.getX() - m.getX());
int screenWidth = 500;
int screenHeight = 500;
int ctrY = screenHeight/2;
int ctrX = screenWidth/2;
Point2D center = new Point2D.Double(ctrX,ctrY );
Point2D mouse = new Point2D.Double(ctrX, ctrY-100);
double straightAbove = angle.apply(center, mouse);
System.out.println("StraightAbove: " + straightAbove);
mouse = new Point2D.Double(ctrX+100, ctrY);
double straightRight = angle.apply(center, mouse);
System.out.println("StraightRight: " + straightRight);
mouse = new Point2D.Double(ctrX, ctrY+100);
double straightBelow = angle.apply(center, mouse);
System.out.println("StraightBelow: " + straightBelow);
mouse = new Point2D.Double(ctrX-100, ctrY);
double straightLeft = angle.apply(center, mouse);
System.out.println("Straightleft: " + straightLeft);
打印
StraightAbove: 0.0
StraightRight: 90.0
StraightBelow: 180.0
Straightleft: 270.0
我将弧度输出从 Math.atan2
转换为度数。对于您的应用程序,将它们保留为弧度可能更方便。
这里有一个类似的Function
使用Math.hypot
BiFunction<Point2D, Point2D, Double> distance = (c,m) ->
Math.hypot(c.getY() - m.getY(),
c.getX() - m.getX());