我已经读过,当我知道Y和X时,计算atan2(y,x)
以获得角度而不是使用asin和acos的单个值会更好。我试图深入研究math.h
lib,但我没有找到任何公式。
有人可以解释为什么atan2
会更好吗?
答案 0 :(得分:1)
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&gt; = 0,那么
theta = acos(x);
更简单,也许比atan2更快。但同样,速度随实施而变化。 atan2可能会或可能不会使用acos和asin,或者使用更快的算法来实现。
答案 1 :(得分:1)
我猜你正在比较看起来像这样的两段代码:
angle = atan2(x, y);
和
angle = acos(x / sqrt(x * x + y * y));
(我假设是C代码)
第一部分直接计算你需要的东西,而第二部分以迂回的方式计算它 - 很自然地期望第一部分更快(除非 atan2
实现包含一些第二个代码示例的变体)。
此外,atan
是一个非常“原始”的功能 - 它“感觉”比“acos”或“asin”更通用。 x87 has a command for it,所以我希望acos
的旧实现在内部使用atan2
。另外,我对SSE知之甚少,但是期望SSE实现atan2
是合理的,即使只是为了与x87的兼容性。