Java:旋转图像,使其指向鼠标光标

Java:旋转图像,使其指向鼠标光标,java,image,swing,rotation,awt,Java,Image,Swing,Rotation,Awt,我希望播放器图像指向鼠标光标。我使用以下代码获取鼠标光标的位置: private int cursorX = MouseInfo.getPointerInfo().getLocation().x; private int cursorY = MouseInfo.getPointerInfo().getLocation().y; 注意:默认播放器图像指向上方您必须使用它来计算旋转角度。为此,首先需要获取图像和光标的位置。我无法告诉您如何获得图像的位置,因为这可能会有所不同。对于这个示例(改编自)

我希望播放器图像指向鼠标光标。我使用以下代码获取鼠标光标的位置:

private int cursorX = MouseInfo.getPointerInfo().getLocation().x;
private int cursorY = MouseInfo.getPointerInfo().getLocation().y;
注意:默认播放器图像指向上方

您必须使用它来计算旋转角度。为此,首先需要获取图像和光标的位置。我无法告诉您如何获得图像的位置,因为这可能会有所不同。对于这个示例(改编自),我将假定
imageX
imageY
是图像的
x
y
位置:

float xDistance = cursorX - imageX;
float yDistance = cursorY - imageY;
double rotationAngle = Math.toDegrees(Math.atan2(yDistance, xDistance));
为了计算旋转角度,必须使用。为此,首先需要获取图像和光标的位置。我无法告诉您如何获得图像的位置,因为这可能会有所不同。对于这个示例(改编自),我将假定
imageX
imageY
是图像的
x
y
位置:

float xDistance = cursorX - imageX;
float yDistance = cursorY - imageY;
double rotationAngle = Math.toDegrees(Math.atan2(yDistance, xDistance));

为了求从一个坐标(0,0)到另一个坐标(x,y)的角度,我们可以使用三角函数tan^-1(y/x)

Java的类指定了一个静态方法atan2,该方法充当tan^-1函数(也称为“反正切”,因此称为“atan”),并以弧度返回角度。(有一个方法
atan
,它接受一个参数。请参阅链接的Javadoc。)

为了找到从“玩家”坐标到鼠标光标坐标的角度(以度为单位)(我假设你提到的这个“玩家”有x和y坐标),我们需要这样做:

double theta = Math.atan2(cursorY - player.getY(), cursorX - player.getX());

同样值得注意的是,零弧度的角度表示鼠标直接位于玩家的右侧。您提到“默认玩家图像”指向上方;如果您的意思是在旋转之前,您的图像面向播放器,那么对于几何体和Java实现来说,默认情况下,让播放器正面朝上会更为传统。

要找到从一个坐标(0,0)到另一个坐标(x,y)的角度,我们可以使用三角函数tan^-1(y/x)

Java的类指定了一个静态方法atan2,该方法充当tan^-1函数(也称为“反正切”,因此称为“atan”),并以弧度返回角度。(有一个方法
atan
,它接受一个参数。请参阅链接的Javadoc。)

为了找到从“玩家”坐标到鼠标光标坐标的角度(以度为单位)(我假设你提到的这个“玩家”有x和y坐标),我们需要这样做:

double theta = Math.atan2(cursorY - player.getY(), cursorX - player.getX());

同样值得注意的是,零弧度的角度表示鼠标直接位于玩家的右侧。您提到“默认玩家图像”指向上方;如果您的意思是在旋转之前,您的图像面向玩家,那么对于几何体和atan2的Java实现来说,“默认情况下”让玩家的脸朝上会更为传统。

尽管两年前有人问过这个问题

如果需要鼠标不断更新窗口中的鼠标位置,请参见。用于获取鼠标位置的当前值是相对于整个屏幕的。记住这一点

否则,我就用这个方法

public double angleInRelation(int x1, int y1, int x2, int y2) {
    // Point 1 in relation to point 2
    Point point1 = new Point(x1, y1);
    Point point2 = new Point(x2, y2);
    int xdiff = Math.abs(point2.x - point1.x);
    int ydiff = Math.abs(point2.y - point1.y);
    double deg = 361;
    if ( (point2.x > point1.x) && (point2.y < point1.y) ) {
        // Quadrant 1
        deg = -Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));

    } else if ( (point2.x > point1.x) && (point2.y > point1.y) ) {
        // Quadrant 2
        deg = Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));

    } else if ( (point2.x < point1.x) && (point2.y > point1.y) ) {
        // Quadrant 3
        deg = 90 + Math.toDegrees(Math.atan(Math.toRadians(xdiff) / Math.toRadians(ydiff)));

    } else if ( (point2.x < point1.x) && (point2.y < point1.y) ) {
        // Quadrant 4
        deg = 180 + Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));

    } else if ((point2.x == point1.x) && (point2.y < point1.y)){
        deg = -90;
    } else if ((point2.x == point1.x) && (point2.y > point1.y)) {
        deg = 90;
    } else if ((point2.y == point1.y) && (point2.x > point1.x)) {
        deg = 0;
    } else if ((point2.y == point2.y) && (point2.x < point1.x)) {
        deg = 180;
    }
    if (deg == 361) {
        deg = 0;
    }
    return deg;
}
公共双角度关系(intx1、inty1、intx2、inty2){
//第1点相对于第2点
点1=新点(x1,y1);
点2=新点(x2,y2);
int xdiff=Math.abs(point2.x-point1.x);
int ydiff=Math.abs(point2.y-point1.y);
双度=361;
if((point2.x>point1.x)和&(point2.ypoint1.x)和&(point2.y>point1.y)){
//象限2
deg=数学toDegrees(数学atan(数学toRadians(ydiff)/数学toRadians(xdiff));
}else if((point2.xpoint1.y)){
//象限3
deg=90+数学toDegrees(数学atan(数学toRadians(xdiff)/数学toRadians(ydiff));
}else if((point2.xpoint1.y)){
度数=90;
}else if((point2.y==point1.y)&&(point2.x>point1.x)){
deg=0;
}else if((point2.y==point2.y)&&(point2.x
换句话说,你得到了每个θs的角度,如下图所示,然后检查x或y是否为0,并对此做一个特例

原点是图片的中间,每个点(用手绘十字标记)都是鼠标位置所在的位置


虽然两年前有人问过这个问题

如果需要鼠标不断更新窗口中的鼠标位置,请参见。用于获取鼠标位置的当前值是相对于整个屏幕的。记住这一点

否则,我就用这个方法

public double angleInRelation(int x1, int y1, int x2, int y2) {
    // Point 1 in relation to point 2
    Point point1 = new Point(x1, y1);
    Point point2 = new Point(x2, y2);
    int xdiff = Math.abs(point2.x - point1.x);
    int ydiff = Math.abs(point2.y - point1.y);
    double deg = 361;
    if ( (point2.x > point1.x) && (point2.y < point1.y) ) {
        // Quadrant 1
        deg = -Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));

    } else if ( (point2.x > point1.x) && (point2.y > point1.y) ) {
        // Quadrant 2
        deg = Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));

    } else if ( (point2.x < point1.x) && (point2.y > point1.y) ) {
        // Quadrant 3
        deg = 90 + Math.toDegrees(Math.atan(Math.toRadians(xdiff) / Math.toRadians(ydiff)));

    } else if ( (point2.x < point1.x) && (point2.y < point1.y) ) {
        // Quadrant 4
        deg = 180 + Math.toDegrees(Math.atan(Math.toRadians(ydiff) / Math.toRadians(xdiff)));

    } else if ((point2.x == point1.x) && (point2.y < point1.y)){
        deg = -90;
    } else if ((point2.x == point1.x) && (point2.y > point1.y)) {
        deg = 90;
    } else if ((point2.y == point1.y) && (point2.x > point1.x)) {
        deg = 0;
    } else if ((point2.y == point2.y) && (point2.x < point1.x)) {
        deg = 180;
    }
    if (deg == 361) {
        deg = 0;
    }
    return deg;
}
公共双角度关系(intx1、inty1、intx2、inty2){
//第1点相对于第2点
点1=新点(x1,y1);
点2=新点(x2,y2);
int xdiff=Math.abs(point2.x-point1.x);
int ydiff=Math.abs(point2.y-point1.y);
双度=361;
if((point2.x>point1.x)和&(point2.ypoint1.x)和&(point2.y>point1.y)){
//象限2
deg=数学toDegrees(数学atan(数学toRadians(ydiff)/数学toRadians(xdiff));
}如果((点2.x<点1