我一直在寻找几个小时的答案,并且一无所获。如果这是重复,我道歉但我无法在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|)
并遇到了类似的问题
答案 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
接近无穷大时。