我有一个标准化的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));
是否有更好/更快的方法来完成此任务?
答案 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
的实际实现可能已经使用了相同的技巧,该技巧是由具有丰富经验的人编写的。因此,这并不是一个正确的答案,但我希望它仍然有用。