如何从矢量有效地计算cotangents

时间:2015-07-01 10:40:44

标签: c++ geometry trigonometry

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

  

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

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

这里选择的方法是什么? (除了上面提到的那个之外,还有另外一个)

1 个答案:

答案 0 :(得分:3)

你可能想要在两个向量之间采用角度的余切

您确实可以先用

计算角度
set @Total =  (@Total * power(1 + (@Value1 / 100.0), @OriginalValue) + (@Per_Month / 100.0) * ( CASE WHEN @OriginalValue = 0 THEN 1 
ELSE
   CASE
      WHEN (@Value1 / 100.0)<> 0
        THEN (power(1 + (@Value1 / 100.0), @OriginalValue) - 1) / (@Value1 / 100.0) * (1 + (@Value1 / 100.0) * @Method)
      ELSE @OriginalValue 
   END
END))

或更好

Angle= atan(cross / dot) 

该角度也可以作为两个矢量的方向的差异来获得

Angle= atan2(cross, dot)

然后拿出余切

Angle= atan2(by, bx) - atan2(ay, ax)

或互补角的切线

1. / tan(Angle)

无论如何,认为这涉及对两个或三个超越函数的评估,这些函数代价高昂且准确性较低。

从上面的第三个等式中,你可以推导出

tan(atan2(dot, cross))

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

所以

cotan(Angle)= (1 + by/bx.ay/ax) / (by/bx - ay/ax)

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

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