Вращение точки вокруг другой точки

0

Я пытаюсь повернуть одну точку вокруг центральной точки на угол - стандартную проблему. Я видел много сообщений об этом, но я не могу заставить свою реализацию работать:

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

Это мой код, логика которого я почерпнул из большого источника, например здесь, и здесь.

Насколько мне известно, это должно сработать. Однако, когда я применяю его к вращению, например, точка (0, 100) на 90 градусов (Pi/2 задается функции) вокруг (0, 0), повернутая точка, по-видимому, находится на (-100, [ CN00]); 100px ниже, где это должно быть.

При попытке нарисовать круг (36 очков) - он создает смутную форму сердца. Похоже, что график, который я видел, я думаю, был в полярных координатах - мне нужно преобразовать свою точку в картезианскую или что-то еще?

Может ли кто-нибудь заметить что-то не так с моим кодом?

Edit: К сожалению, эта функция является функцией-членом класса Point - x и y являются переменными-членами:/

  • 0
    Какое значение x используется в последней строке?
  • 0
    @OliverCharleswoth Спасибо за указание на это, отредактировано
Показать ещё 3 комментария
Теги:
math
rotation

1 ответ

2
Лучший ответ

Вы почти там, но вы изменяете x в следующей строке, что означает, что значение этой координаты, введенной в вычисление y неверно!

Вместо этого используйте временные переменные для новых x и y а затем добавьте координаты Pivot после:

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

x = nx + Pivot.x;
y = ny + Pivot.y;
  • 0
    Argh. Спасибо, это была действительно глупая ошибка с моей стороны: /

Ещё вопросы

Сообщество Overcoder
Наверх
Меню