我读过一些关于计算角度的文章,当我知道Y和X的值时,使用atan2(y,x)
计算角度比使用asin和acos单个值更好。我尝试研究了math.h
库,但没有找到任何公式。
有人能解释一下为什么atan2
更好吗?
我读过一些关于计算角度的文章,当我知道Y和X的值时,使用atan2(y,x)
计算角度比使用asin和acos单个值更好。我尝试研究了math.h
库,但没有找到任何公式。
有人能解释一下为什么atan2
更好吗?
我猜您正在比较两段代码,它们看起来大致如下:
angle = atan2(x, y);
并且
angle = acos(x / sqrt(x * x + y * y));
第一部分直接计算所需内容,而第二部分则采用了迂回的方式进行计算 - 人们自然会期望第一个方法更快(除非 atan2
的实现包含第二份示例代码的某种变体)。
此外,atan
是一个相当"原始"的函数 - 它比 "acos" 或 "asin" 更加通用。x87有一个命令用于它,因此我预计旧版本的acos
将在内部使用atan2
。此外,我对SSE的了解还不够多,但可以合理地预计,即使只是为了与x87兼容,SSE也会实现atan2
。
theta = atan2(y,x);
比起:
float in = 1.0/sqrt(x*x+y*y);
theta = acos(x*in);
if(y<0)
theta = -acos(x*in);
else
theta = acos(y*in);
你不觉得吗?这样更简单,也许会更快,取决于实现方式。
现在,如果x和y不是任意的,而是可以假设例如x²+y²=1且y≥0,则
theta = acos(x);
这个方法可能比atan2更简单,也许更快。但是速度会因实现方式而异。atan2可能使用acos和asin或更快的算法来实现。
atan2
更好的原因是显而易见的:您无需先计算商,您不会遇到一个变量为零或接近零的问题,您也不必调整输出以进入正确的半圆。 - user1084944