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 变化的变化。也称为斜率,它是特定角度的 sincos 的比率。要找到该角度,可以使用 arctanMath.atanMath.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());