在Java中找到两点之间的角度表现得很奇怪

时间:2013-07-28 21:15:57

标签: java

我一直在寻找几个小时的答案,并且一无所获。如果这是重复,我道歉但我无法在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之间的值

有人知道为什么这个功能会以这种方式运行,以及我如何得到我想要的答案?

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

2 个答案:

答案 0 :(得分:2)

好像你的数学错了。我的方法是找到水平角度,然后减去90°。例如:

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

为什么你错了是因为你要从彼此中减去向量,以便得到由新向量定义的三角形的角度。通过将其测量到X轴并从90减去它将更容易:D

答案 1 :(得分:2)

您应该只使用

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

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

Math.atan2(x, x-1)

是e quivalent to

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

因此显然接近正确的

Math.atan(1)
x接近无穷大时