【问题标题】:How to efficiently calculate cotangents from vectors如何有效地计算向量的余切
【发布时间】:2015-07-01 10:40:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您的公式表示:(xa.ya+xb.yb)/(xa.yb-xb.ya),只要 xa.yb 不等于 xb,它对我来说就可以了。是的。我没有看到更快的方法
  • 只要你不知道他们的理由,就不要把同事的陈述当真。

标签: c++ geometry trigonometry


【解决方案1】:

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

你确实可以先计算角度

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)

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

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

【讨论】:

  • 在最后一个等式中你有一个错字...(ax by - ay by)如果我没记错的话应该是(ax by - ay bx)
猜你喜欢
  • 2018-11-20
  • 2015-01-14
  • 2019-05-10
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
相关资源
最近更新 更多