Geometry 如何在没有trig函数的情况下缩放2D旋转向量?

Geometry 如何在没有trig函数的情况下缩放2D旋转向量?,geometry,2d,trigonometry,Geometry,2d,Trigonometry,我有一个标准化的2D向量,我用它来旋转其他2D向量。在一个实例中,它表示“旋转”(或“角动量”),并用于旋转简单多边形的“方向”。My vector类包含以下方法: 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; } 到目前为止,这一切都是有效的,没有使用任何触发器 但是,我希望“旋转”

我有一个标准化的2D向量,我用它来旋转其他2D向量。在一个实例中,它表示“旋转”(或“角动量”),并用于旋转简单多边形的“方向”。My vector类包含以下方法:

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;
}
到目前为止,这一切都是有效的,没有使用任何触发器

但是,我希望“旋转”随时间衰减。这意味着自旋的角度应该趋向于零。在这里,我不知道如何在没有像这样昂贵的trig调用的情况下做到这一点:

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

有没有更好/更快的方法来实现这一点?

如果确实是三角函数减慢了计算速度,您可以尝试用它们的近似值来近似它们

对于接近零的
x

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

cos(x) = 1 - (x^2)/2
错误顺序为
x^3
(实际上,
x^4
,因为
x^3
的术语无论如何都是零)


然而,我认为这并不能解决您的问题:
atan
的实际实现很可能已经在使用相同的技巧,由一位在加速这些事情方面有丰富经验的人编写。因此,这不是一个正确的答案,但我希望它仍然有用。

简单的公式只适用于
自旋衰减=1/2
(以及算术级数
an[I]=an0-I*da
)。否则最好存储
角度
,以避免
atan2
。如果将相同的旋转应用于多个点,则每一步的单次正/反计算也不会太糟糕。关于这一点,请参见末尾的旋转数学。。。注意,它仅适用于高达
90deg
的旋转,旋转不是线性的,但距离也不是太远,并且适用于任何维度…通过减少
dang0
或通过
dang0*=0.95
每次迭代等,即可实现调暗。。。计算
a
不需要
acos
,因为你已经知道你的原始旋转有多大了……另一个想法:用泰勒展开近似三角函数怎么样?@DominikMokriš,听起来很有趣。你能说得更多和/或提供细节吗?不太清楚如何实现这一点。顺便说一下,我确实考虑过类似这样的查找:int xI= int((自旋.x+1)*100);int iY=int((自旋y+1)*100);自旋=DecayLookupX[iX][iY];其中DecayLookup是一个200 x 200的预计算向量数组(可以调整)。有点粗糙,但会持续衰减。啊。谢谢你的解释。这可能值得研究。虽然我的衰减应该是恒定的,但我想我可能可以通过一个预先计算的查找表逃脱。尽管如此,还是很感激!
cos(x) = 1 - (x^2)/2