c++ - 如何有效地计算 vector 的余切

标签 c++ geometry trigonometry

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

cot(a, b) = (a * b) / |a x b|, where a and b are vectors

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

这里选择的方法是什么? (除了上面提到的,还有没有其他的)

最佳答案

您可能想要取两个 vector 之间夹角的余切

你确实可以先计算角度

Angle= atan(cross / dot) 

或更好

Angle= atan2(cross, dot)

这个角度也可以作为两个 vector 的方向之差得到

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)

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

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

关于c++ - 如何有效地计算 vector 的余切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31159016/

相关文章:

java - 不会增加半径,但应该

trigonometry - 像 mpmath 这样的任意精度库如何评估简单的三角函数?

python - 方程 latex 代码的余弦相似度

c++ - 你如何反汇编 gdb 中的重载运算符?

c++ - 为什么即使内容发生变化,字符串变量的 sizeof() 也总是返回相同的数字?

c++ - 在 Android NDK 的 C++ arm 中出现缩小转换错误

c++ - QT 从文件和文件夹列表中选择多项

用于创建球体坐标的 Python 程序不起作用

java - 确定一个弧是否包含/覆盖另一个弧

c++ - 圆上两个度数标记之间的最短距离?