2010-04-18 145 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)。