0
votes

I'm trying to rotate one point around a central point by an angle - standard problem. I've seen lots of posts about this but I can't get my implementation to work:

    void Point::Rotate(const Point Pivot, const float Angle)
    {
        if (Angle == 0)
            return;

        float s = sin(Angle);
        float c = cos(Angle);

        x -= Pivot.x;
        y -= Pivot.y;

        x = (x * c) - (y * s) + Pivot.x;
        y = (x * s) + (y * c) + Pivot.y;
    }

This is my code, the logic of which I've gleaned from numerous source, for example here, and here.

As far as I'm aware, it should work. However, when I apply it to rotating for example, the point (0, 100) by 90 degrees (Pi/2 is given to the function) around (0, 0), the rotated point is apparently at (-100, -100); 100px below where it should be.

When trying to draw a circle (36 points) - it creates a vague heart shape. It looks like a graph I saw that I think was in polar coordinates - do I need to convert my point to Cartesian or something?

Can anyone spot anything wrong with my code?

Edit: Sorry, this function is a member function to a Point class - x and y are the member variables :/

1
What value of x is being used in the final line?Oliver Charlesworth
@OliverCharleswoth Thanks for pointing that out, editedhnefatl
I think you have missed my point! The final line uses a value of x; where is that value calculated?Oliver Charlesworth
@OliverCharlesworth That's the current x position - the member variable. Not sure how else to explain it?hnefatl
@OliverCharlesworth Oh, right >.< I'm an idiothnefatl

1 Answers

3
votes

You're almost there, but you're modifying x in the next-to-last line, meaning that the value of that coordinate fed into the y calculation is incorrect!

Instead, use temporary variables for the new x and y and then add the Pivot coordinates on afterwards:

double nx = (x * c) - (y * s);
double ny = (x * s) + (y * c);

x = nx + Pivot.x;
y = ny + Pivot.y;