web-dev-qa-db-ja.com

2点間の角度の計算-java

与えられた2点と線で結ばれた固定点を使用して、2点間の角度を度単位で計算する必要があります。

これが私が必要なものを説明する画像です:

enter image description here

これが私がこれまでに試したことです:

public static float GetAngleOfLineBetweenTwoPoints(float x1, float x2, float y1, float y2) {
        float xDiff = x2 - x1;
        float yDiff = y2 - y1;
        return (float) (Math.atan2(yDiff, xDiff) * (180 / Math.PI));
}

それが正しい答えを提供しないことは言うまでもありません。

9
David Lasry

Math.atan2メソッドを使用して、角度をラジアンで計算する次のメソッドを使用できます。

public static double angleBetweenTwoPointsWithFixedPoint(double point1X, double point1Y, 
        double point2X, double point2Y, 
        double fixedX, double fixedY) {

    double angle1 = Math.atan2(point1Y - fixedY, point1X - fixedX);
    double angle2 = Math.atan2(point2Y - fixedY, point2X - fixedX);

    return angle1 - angle2; 
}

そして、それを3つのポイントで呼び出します(Math.toDregreesを使用して、結果の角度をラジアンから度に変換します)。

System.out.println(Math.toDegrees(
            angleBetweenTwoPointsWithFixedPoint(0, 0, // point 1's x and y
                                                1, 1, // point 2
                                                1, 0  // fixed point
                                               )));

出力:90.0

ただし、ソリューションではJavaの標準のPointまたはLine2Dクラスを自由に使用してください。これは、それが機能することを示すためだけのものでした。

14
Voicu

これが私のAndroidジェスチャーライブラリからのコードスニペットです。動作し、完全にテストされています。

public double getAngleFromPoint(Point firstPoint, Point secondPoint) {

    if((secondPoint.x > firstPoint.x)) {//above 0 to 180 degrees

        return (Math.atan2((secondPoint.x - firstPoint.x), (firstPoint.y - secondPoint.y)) * 180 / Math.PI);

    }
    else if((secondPoint.x < firstPoint.x)) {//above 180 degrees to 360/0

        return 360 - (Math.atan2((firstPoint.x - secondPoint.x), (firstPoint.y - secondPoint.y)) * 180 / Math.PI);

    }//End if((secondPoint.x > firstPoint.x) && (secondPoint.y <= firstPoint.y))

    return Math.atan2(0 ,0);

}//End public float getAngleFromPoint(Point firstPoint, Point secondPoint)
6
user2288580

@ user2288580はわかりませんが、単純なテストケースであっても、コードが失敗します。

firstPoint =(0,0)secondPoint =(0、5)、(5,5)、(5,0)、(5、-5)(0、-5)(-5、-5)、(-5 、0)

これがあなたのために働くかどうか見てください@ David-

public double angleBetween2CartesianPoints(double firstX, double firstY, double secondX, double secondY) {
    double angle = Math.atan2((secondX - firstX), (secondY - firstY)) * 180 / Math.PI;
    if (angle < 0) {
        return (360 + angle);
    } else {
        return (angle);
    }
}
1