# Need to use trig to make a ship point in the right direction

I'm making a 2D spaceship-shooter game that moves in all directions, (i.e. ( -x, +x ),( -y, +y ) ).

I'm trying to make the spaceship face the direction of the movement according to a virtual joystick. The virtual joystick has it's x and y coordinates working correctly and they are normalized (ie. between -1 and +1) in both x and y.

I'm able to set the angle of the image I'm using by a call to

SetSpriteAngle(spriteNum, angle)


where the angle is in degrees. The problem I'm having is with the trigonometry involved.

I know from trig that calculating the angle is radius*cos(x), and I could be wrong on that, so I tried this:

x = GetVirtualJoystickX(1)
y = GetVirtualJoystickY(1)
r = sqrt(x*x + y*y)

angle = r * cos(x)

SetSpriteAngle(1,angle)


Problem one is, there's no account for the Y direction, so I tried:

angle = r*cos(x) + r*sin(y)


Still a problem, just not working correctly, so I tried arcsine and arccosine:

angle = r*aCos(x) + r*aSin(y)


Now the image is just flipping in what seems like a random direction, and just in case it was calculating, instead of the total angle, perhaps it was the angle from the x intercept, so I tried:

if GetVirtualJoystickX(1) > 0 and GetVirtualJoystickY(1) > 0
//angle = angle
elseif  GetVirtualJoystickX(1) < 0 and GetVirtualJoystickY(1) > 0
angle = angle - 180
elseif  GetVirtualJoystickX(1) < 0 and GetVirtualJoystickY(1) > 0
angle = angle - 270
elseif  GetVirtualJoystickX(1) > 0 and GetVirtualJoystickY(1) < 0
angle = angle - 360
else
angle = 0
endif


Now it's only flipping as if angle is close to 0 and moving occasionally in a certain 270 degree position I believe,

So I guess I'm going to have to admit that my trigonometry skills aren't what they used to be and ask you guys for some help, by the way sin(x) is where x is in degrees and sinr(x) is where x is in radians, so I might be missing it there too, frankly I'm just too confused to get any farther right now.

Thanks guys!

• Sqrt(n) is for length... You want to use atan2(y, x) instead – Savlon Apr 21 '13 at 10:11
• Don't randomly apply functions and hope it accidentally works. If you're not "good" at trigonometry, study it until you are. en.wikipedia.org/wiki/Trigonometry – Seth Battin Apr 22 '13 at 1:13

I've had a huge problem with angles myself.
Now i'm not very good with math or trig, but I'll give you the code I use to calculate the angle between two Vector2's (Resulting angle is between the two vectors and the Y axis, I believe). Works pretty good.

internal static double calcAngle(Vector2 me, Vector2 foe)
{
double angle;

Vector2 direction = foe - me;
direction.Normalize();
float rotationInRadians = (float)Math.Atan2((double)direction.Y, (double)direction.X) + MathHelper.PiOver2;

if (angle < 0)
{
angle = 360 + angle;
}
return angle;
}


As you can see, the arc tan2 of the normalized subtracted vector of two vectors + PiOver2 gives us an angle in radians.
The code below the aforementioned part transforms the angle to an angle in degrees (0-359 degrees, no negatives).

Hope this helps :)

PS: You can use the angle to create a Z rotation on a matrix, then use the matrix to transform the ship's vector, thus making it "go" to the angle provided to the matrix. Ask me in the comment for the code if you want, i'll edit this answer.

I found my own anwer using:

angle = atan2( GetVirtualDeviceY(1), GetVirtualDeviceX(1) );


with this, there's no need to do the if then statements for each quadrants.