我讀過,當我知道Y和X時,最好計算atan2(y,x)
以獲得角度,而不是在asin和acos中使用單個值。我試圖挖掘math.h
庫,但我沒有找到任何公式。爲什麼atan2(y,x)比arcsin或arccos計算更快?
有人可以解釋爲什麼atan2
更好?
我讀過,當我知道Y和X時,最好計算atan2(y,x)
以獲得角度,而不是在asin和acos中使用單個值。我試圖挖掘math.h
庫,但我沒有找到任何公式。爲什麼atan2(y,x)比arcsin或arccos計算更快?
有人可以解釋爲什麼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 2 + y 2 = 1個,Y> = 0,則
theta = acos(x);
更簡單,也許比ATAN2快。但是,速度隨實現的不同而不同。 atan2可能或可能不會使用acos和asin來實現,或者使用更快的算法。
我猜你是比較兩段代碼,看起來大多是這樣的:
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兼容。
那麼,爲什麼'atan2'更好*顯然是有原因的:你不需要首先計算一個商,你沒有任何問題,一個變量爲零或幾乎是這樣,你沒有調整輸出以獲得正確的半圓形。 – Hurkyl
順便提一下,當你提出問題時,通常會發布代碼。這樣人們不必猜測,並會提供更好的答案。另外,爲代碼的語言添加標籤也是很好的選擇。這將使該語言的專家更容易找到你的問題。你可以[編輯]你的問題來包含代碼。 – anatolyg