如何旋转矢量?
How do I rotate a vector?
如果我有 [1, 0]
并旋转它 90 degrees = 1/2PI radians
,我应该得到 [0, -1]
。我该如何实现?
我查看了 this page 并实现了这个:
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)
);
};
但这似乎不起作用。
无论是度数还是弧度都没有关系,因为几何形状保持不变。我现在使用弧度。
您的公式是正确的,但您需要使用以弧度而不是度为单位的角度:
radians = degrees * (Math.PI/180)
如果您想顺时针旋转它,请注意您的角度是 -90 度而不是 90 度。或者,将其视为 90 度,但将公式更改为:
radians = -degrees * (Math.PI/180)
编辑:
根据您上次的编辑,您可能会得到以下结果:
[6.123233995736766e-17, -1]
这是因为计算机无法存储 "infinite" 个数字。但是,正如你所看到的那样,这个数字很小,所以可以认为是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]
后来我发现PVector
有一个方法:rotate(angle)
如果我有 [1, 0]
并旋转它 90 degrees = 1/2PI radians
,我应该得到 [0, -1]
。我该如何实现?
我查看了 this page 并实现了这个:
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)
);
};
但这似乎不起作用。
无论是度数还是弧度都没有关系,因为几何形状保持不变。我现在使用弧度。
您的公式是正确的,但您需要使用以弧度而不是度为单位的角度:
radians = degrees * (Math.PI/180)
如果您想顺时针旋转它,请注意您的角度是 -90 度而不是 90 度。或者,将其视为 90 度,但将公式更改为:
radians = -degrees * (Math.PI/180)
编辑:
根据您上次的编辑,您可能会得到以下结果:
[6.123233995736766e-17, -1]
这是因为计算机无法存储 "infinite" 个数字。但是,正如你所看到的那样,这个数字很小,所以可以认为是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]
后来我发现PVector
有一个方法:rotate(angle)