如何旋转一个向量?

6
如果我有[1, 0],并将其旋转90度=1/2PI弧度,那么我应该得到[0, -1]。我该如何实现这个操作?
我查看了这个页面并实现了以下内容:
var rotateVector = function(vec, ang)
{
    // not right!
    return new PVector(
        vec.x * cos(ang) - vec.y * sin(ang),
        vec.x * sin(ang) + vec.y * cos(ang)
    );
};

但这似乎行不通。

无论是度数还是弧度,几何形状都是相同的。我现在使用弧度。


你的角度是弧度吗? - Ivan Sivak
1
注意:大多数极性系统对于逆时针旋转是正的,而对于顺时针旋转则是负的。 - amphetamachine
2个回答

9
您的公式是正确的,但需要使用弧度而不是角度:
radians = degrees * (Math.PI/180)

如果你想顺时针旋转它,请注意你的角度是-90度而不是90度。或者,将其视为90度,但更改公式为:

radians = -degrees * (Math.PI/180)

编辑:

根据您的最新编辑,您可能会获得以下结果:

[6.123233995736766e-17, -1]

这是因为计算机无法存储“无限”的数字。但是,正如您所看到的,该数字非常小,因此可以视为0。 您可以将结果四舍五入。

例如:

var rotateVector = function(vec, ang)
{
    ang = -ang * (Math.PI/180);
    var cos = Math.cos(ang);
    var sin = Math.sin(ang);
    return new Array(Math.round(10000*(vec[0] * cos - vec[1] * sin))/10000, Math.round(10000*(vec[0] * sin + vec[1] * cos))/10000);
};

使用以下命令进行测试:

rotateVector([1,0], 90)

结果:

[0, -1]

1
我后来发现 PVector 有一个方法可以实现它: rotate(angle)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接