如何有效地计算向量的余切
How to efficiently calculate cotangents from vectors
我正在尝试实现一个函数来通过标准公式计算向量(数学上的)的余切:
cot(a, b) = (a * b) / |a x b|, where a and b are vectors
同事告诉我,计算1/|a x b|
不是最好的东西交给电脑来计算。我想到的另一种选择是首先计算角度,而不是使用弧度角的 cotan 函数。
这里选择的方法是什么? (除了上面提到的,还有没有其他的)
您可能想要取两个向量之间夹角的余切值。
你确实可以先用
计算角度
Angle= atan(cross / dot)
或更好
Angle= atan2(cross, dot)
这个角度也可以作为两个向量的方向之差得到
Angle= atan2(by, bx) - atan2(ay, ax)
然后取余切
1. / tan(Angle)
或余角的正切
tan(atan2(dot, cross))
总之,认为这涉及到两个或三个超越函数的评估,成本高且准确性较低。
由上面的第三个等式,可以推导出
cotan(Angle)= (1 + by/bx.ay/ax) / (by/bx - ay/ax)
这只是对您的初始公式的重写,但成本更高(3 个分区)并且可能会因更多角度而失败。
所以
(ax bx + ay by) / (ax by - ay bx)
绝对是更快更安全的方法。
除非有特殊情况,比如低精度就足够了,同时计算其他表达式或向量条件,我看不出更好的方法。
我正在尝试实现一个函数来通过标准公式计算向量(数学上的)的余切:
cot(a, b) = (a * b) / |a x b|, where a and b are vectors
同事告诉我,计算1/|a x b|
不是最好的东西交给电脑来计算。我想到的另一种选择是首先计算角度,而不是使用弧度角的 cotan 函数。
这里选择的方法是什么? (除了上面提到的,还有没有其他的)
您可能想要取两个向量之间夹角的余切值。
你确实可以先用
计算角度Angle= atan(cross / dot)
或更好
Angle= atan2(cross, dot)
这个角度也可以作为两个向量的方向之差得到
Angle= atan2(by, bx) - atan2(ay, ax)
然后取余切
1. / tan(Angle)
或余角的正切
tan(atan2(dot, cross))
总之,认为这涉及到两个或三个超越函数的评估,成本高且准确性较低。
由上面的第三个等式,可以推导出
cotan(Angle)= (1 + by/bx.ay/ax) / (by/bx - ay/ax)
这只是对您的初始公式的重写,但成本更高(3 个分区)并且可能会因更多角度而失败。
所以
(ax bx + ay by) / (ax by - ay bx)
绝对是更快更安全的方法。
除非有特殊情况,比如低精度就足够了,同时计算其他表达式或向量条件,我看不出更好的方法。