2

私は数時間答えを探していましたが、何も見つかりませんでした。これが重複している場合は申し訳ありませんが、StackOverflow で特定の問題の解決策を見つけることができませんでした。

ポイントとy軸の間の角度を見つける関数があります:

public static double getAngle(float x1,float y1) {
    float y_x = 0;
    float y_y = 1;
    float p_x = x1;
    float p_y = y1;

    float theta = (float)Math.atan2((p_x-y_x),(p_y-y_y));
    return (float)Math.toDegrees(theta)
}

次に、それを呼び出すと、奇妙な動作が発生します。

getAngle(1,1); //returns 90.00000250447816
getAngle(5,5); //returns 51.34019265119512
getAngle(10,10); //returns 48.012787449847956
getAngle(100,100); //returns 45.287917631417216
getAngle(1000,1000); //returns 45.02866072599646

私は答えが 45 であることを知っています。関数 `getAngle(x,x) は x の極限が無限大に近づくにつれて 45 に収束しているように見えます。問題は、この関数が 0.01 から 10.0 の間の値に対して機能する必要があることです。

関数がこのように動作する理由と、探している答えを得る方法を知っている人はいますか?

PS私は最初に内積アイデンティティを使用しようとしましたacos((ax*bx+ay*by)/|a||b|)が、同様の問題が発生しました

4

2 に答える 2

2

あなたの計算は間違っているようです。私のアプローチは、水平に対する角度を見つけて、90 からそれを引くことです。例えば:

double theta = Math.PI/2 - Math.atan2(y1,x1); //answer in radians

あなたが間違っている理由は、新しいベクトルによって定義された三角形の角度を取得するために、ベクトルを互いに減算しているためです。X 軸まで測定し、90 から差し引くことで、はるかに簡単になります :D

于 2013-07-28T21:24:19.653 に答える