如何从向量有效地计算余切

mar*_*ker 5 c++ geometry trigonometry

我正在尝试实现一个通过标准公式来计算向量(数学上的)的余切的函数:

cot(ab)=(a * b)/ | a x b |,其中ab是向量

一位同事告诉我,计算机1/|a x b|并不是最好的计算机。我想到的另一种选择是首先计算角度,然后使用弧度函数计算弧度角度。

在这里选择什么方法?(除了提到的以外,可能还有另一个)

小智 6

您可能想要取两个向量之间角度的余切。

您确实可以首先计算角度

Angle= atan(cross / dot) 
Run Code Online (Sandbox Code Playgroud)

或更好

Angle= atan2(cross, dot)
Run Code Online (Sandbox Code Playgroud)

该角度也可以通过两个向量的方向差来获得

Angle= atan2(by, bx) - atan2(ay, ax)
Run Code Online (Sandbox Code Playgroud)

然后取余切

1. / tan(Angle)
Run Code Online (Sandbox Code Playgroud)

或余角的正切

tan(atan2(dot, cross))
Run Code Online (Sandbox Code Playgroud)

无论如何,认为这涉及到两个或三个超越函数的评估,成本高昂且不太准确。

从上面的第三个方程,你可以得出

cotan(Angle)= (1 + by/bx.ay/ax) / (by/bx - ay/ax)
Run Code Online (Sandbox Code Playgroud)

这只是对初始公式的重写,但成本更高(3 个除法),并且对于更多角度可能会失败。

所以

(ax bx + ay by) / (ax by - ay bx)
Run Code Online (Sandbox Code Playgroud)

绝对是更快、更安全的方法。

除非有特殊情况,例如低精度就足够了,同时计算其他表达式或向量上的条件,否则我看不到更好的方法。