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。当 x 的极限接近无穷大时,函数 `getAngle(x,x) 会收敛到 45。问题是我需要这个函数来处理 0.01 到 10.0 之间的值

有谁知道为什么该功能会以这种方式运行以及如何获得我正在寻找的答案?

PS我最初尝试使用点积标识acos((ax*bx+ay*by)/|a||b|)并遇到了类似的问题

4

2 回答 2

2

你应该简单地使用

float theta = (float) ((Math.PI/2) - Math.atan2(y1, x1));

getAngle(x, x)当接近无穷大时,您接近正确角度的原因x是您正在有效地计算

Math.atan2(x, x-1)

相当于

Math.atan(x / (x-1))

因此显然接近正确的

Math.atan(1)

x接近无穷大时。

于 2013-07-28T21:45:11.300 回答
2

看来你的数学是错误的。我的方法是找到与水平面的角度,然后减去 90。例如:

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

为什么你错了是因为你将向量彼此相减,这样你就得到了由新向量定义的三角形的角度。通过测量它到 X 轴并从 90 中减去它会容易得多:D

于 2013-07-28T21:24:19.653 回答