2010-04-18 124 views
8

我有這段代碼,我想知道爲什麼第一個方法的結果與第二個方法的結果不同,給定相同的輸入?兩個2d向量之間的角度,兩種方法之間的差異?

public double AngleBetween_1(vector a, vector b) { 
    var dotProd = a.Dot(b); 
    var lenProd = a.Len*b.Len; 
    var divOperation = dotProd/lenProd; 
    return Math.Acos(divOperation) * (180.0/Math.PI); 
} 

public double AngleBetween_2(vector a, vector b) { 
    var dotProd = a.Dot(b); 
    var lenProd = a.Len*b.Len; 
    var divOperation = dotProd/lenProd; 
    return (1/Math.Cos(divOperation)) * (180.0/Math.PI); 
} 

回答

16

這是因爲第一種方法是正確的,而第二種方法是不正確。

您可能會注意到反餘弦函數有時寫爲「acos」,有時寫爲「cos -1」。這是一個數學符號的怪癖:「cos -1」實際上是反餘弦而不是餘弦的倒數(這是割線)。

但是,如果你看到「COS 」,那麼這就是餘弦的平方,而「COS 」是餘弦的立方體。這種三角函數的符號很奇怪。大多數操作員使用上標來表示重複應用。

+0

當然可以。謝謝!自從我在高中學習之後,我已經有一段時間了。 – bitcycle 2010-04-18 23:52:37

5

Math.Acos(divOperation)不等於1/Math.Cos(divOperation)arccos是cos的,而不是乘法逆。

3

可能是因爲acos(x)≠1/cos(x)。