Я пытаюсь повернуть одну точку вокруг центральной точки на угол - стандартную проблему. Я видел много сообщений об этом, но я не могу заставить свою реализацию работать:
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
являются переменными-членами:/
Вы почти там, но вы изменяете 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;
x
используется в последней строке?