没有触发功能的情况下如何缩放2D旋转矢量?

时间:2019-01-04 00:22:09

标签: geometry 2d trigonometry

我有一个标准化的2D向量,正在使用它来旋转其他2D向量。在一种情况下,它指示“旋转”(或“角动量”),并用于旋转简单多边形的“方向”。我的向量类包含此方法:

rotateByXY(x, y) {
  let rotX = x * this.x - y * this.y;
  let rotY = y * this.x + x * this.y;
  this.x = rotX;
  this.y = rotY;
}

到目前为止,这都是有效的,并且不进行任何触发。

但是,我希望“自旋”随着时间而衰减。这意味着旋转角度应趋于零。在这里,我不知如何避免像这样昂贵的触发调用来做到这一点:

let angle = Math.atan2(spin.y, spin.x);
angle *= SPIN_DECAY;
spin = new Vector2D(Math.cos(angle), Math.sin(angle));

是否有更好/更快的方法来完成此任务?

1 个答案:

答案 0 :(得分:1)

如果确实是三角函数正在减慢您的计算速度,则可以尝试使用其Taylor expansions对其进行近似。

对于my_df[order(my_df$y), ] # x y # 1 10 2018-01-02 UTC--2018-01-03 UTC # 2 9 2018-01-03 UTC--2018-01-04 UTC # 3 8 2018-01-04 UTC--2018-01-05 UTC # 4 7 2018-01-05 UTC--2018-01-06 UTC # 5 6 2018-01-06 UTC--2018-01-07 UTC # 6 5 2018-01-07 UTC--2018-01-08 UTC # 7 4 2018-01-08 UTC--2018-01-09 UTC # 8 3 2018-01-09 UTC--2018-01-10 UTC # 9 2 2018-01-10 UTC--2018-01-11 UTC # 10 1 2018-01-11 UTC--2018-01-12 UTC following identities hold接近于零:

x

根据您的应用程序所需的准确度,可以调整系列。例如,

cos(x) = 1 - (x^2)/2! + (x^4)/4! - (x^6)/6! + ...
sin(x) = x - (x^3)/3! + (x^5)/5! - (x^7)/7! + ...
atan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 + ...

具有cos(x) = 1 - (x^2)/2 数量级的错误(实际上,x^3,因为与x^4的项始终为零)。

但是,我认为这不会解决您的问题:x^3的实际实现可能已经使用了相同的技巧,该技巧是由具有丰富经验的人编写的。因此,这并不是一个正确的答案,但我希望它仍然有用。