[SOLVED] Strange behavior with function that converts a vector2 to an angle in degrees


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


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.

people found this article helpful. What about you?