Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I rotate a vector?

If I have [1, 0] and I rotate it 90 degrees = 1/2PI radians, I should get [0, -1]. How do I achieve this?

I looked at this page and implemented this:

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)
    );
};

But that doesn't seem to work.

It doesn't matter if it's degrees or radians, because the geometry remains the same. I use radians right now.

like image 721
joppiesaus Avatar asked Feb 11 '23 02:02

joppiesaus


1 Answers

Your formulas are correct, but you need to use the angle in radians instead of degrees:

radians = degrees * (Math.PI/180)

And if you want to rotate it clockwise, notice that your angle is -90 degrees instead of 90. Or, consider it 90 but change the formula to:

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

Edit:

According to your last edit, probably you get the following result:

[6.123233995736766e-17, -1]

This is because the computer cannot store "infinite" numbers. But, as you can see that number is very small, so it can be considered 0. You can round the result.

E.g.:

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);
};

And test it using:

rotateVector([1,0], 90)

Result:

[0, -1]
like image 98
ROMANIA_engineer Avatar answered Feb 14 '23 00:02

ROMANIA_engineer