# Issue

This Content is from Stack Overflow. Question asked by Wolf

I am attempting to get a gun to rotate around the player based on a vector2 input

if the y component of the vector is positive it works perfectly as you can see here

Working as intended (Ignore my placeholder graphics)

if the y component is negative however, it returns the same value as if the y value was positive

Not working as intended

I’m sure this has to do with the equation I’m using, in particular the fact that the y component is removed from the equation when multiplied by the y component in my base vector, but other methods I’ve used only make things worse, usually causing the gun to not rotate at all while the y value is negative.

``````static u16 vector2To512Ang(vector2 v) {
// Avoid division by zero
if (v.getMagnitude() == 0)
return 0;

// Base vector
vector2 b = {1, 0};

float angle = acos((v.x * b.x + v.y * b.y)/abs(v.getMagnitude())) * 57.2957795131f;

// Convert to scale of 0-512
return (angle * 512) / 360;
}
``````

To clear up any questions

1. The scale of the output is weird because I’m working with old hardware and it needs a range of 0-512. Removing this scaling results in the same issue so that isn’t the problem
2. The multiplication by 57.2957795131 is the same as 180 / PI precomputed and is done to convert from radians to degrees

# Solution

I’m unsure what you’re after but I think you want the angle between `v.x` and `v.y` scaled to `0-512`. In that case:

``````#include <cmath>
#include <numbers>

// ...

float angle = std::atan2(v.y, v.x);
if(angle < 0.) angle += 2 * std::numbers::pi_v<float>;
return angle * 512 / (2 * std::numbers::pi_v<float>);
// return angle * 256 / std::numbers::pi_v<float>;
``````

``` This Question was asked in  StackOverflow by  Wolf and Answered by Ted Lyngmo It is licensed under the terms of
CC BY-SA 2.5. - CC BY-SA 3.0. - CC BY-SA 4.0.```