2D вращение OpenGL

Вот код, который я использую.

#define ANGLETORADIANS 0.017453292519943295769236907684886f // PI / 180
#define RADIANSTOANGLE 57.295779513082320876798154814105f   // 180 / PI

rotation = rotation *ANGLETORADIANS;

cosRotation = cos(rotation);
sinRotation = sin(rotation);

for(int i = 0; i < 3; i++)
{
px[i] = (vec[i].x + centerX) * (cosRotation - (vec[i].y + centerY)) * sinRotation;
py[i] = (vec[i].x + centerX) * (sinRotation + (vec[i].y + centerY)) * cosRotation;
printf("num: %i, px: %f, py: %f\n", i, px[i], py[i]);
}

пока это шов, мое значение Y переворачивается .. скажем, я ввожу значение X = 1 и Y = 1 с поворотом на 45, вы должны увидеть примерно x = 0 и y = 1.25 ish, но я получаю x = 0 y = — 1,25.

Также мое вращение на 90 градусов всегда возвращает x = 0 и y = 0.

ps. Я знаю, что я только концентрирую свои ценности, а не возвращаю их туда, откуда они пришли. Не нужно их возвращать, так как все, что мне нужно знать, это ценность, которую я сейчас получаю.

0

Решение

Ваше расположение брекетов мне не подходит. Я бы ожидал:

px[i] = (vec[i].x + centerX) * cosRotation - (vec[i].y + centerY) * sinRotation;
py[i] = (vec[i].x + centerX) * sinRotation + (vec[i].y + centerY) * cosRotation;
2

Другие решения

Ваши скобки неверны. Так должно быть

px[i] = ((vec[i].x + centerX) * cosRotation) - ((vec[i].y + centerY) * sinRotation);
py[i] = ((vec[i].x + centerX) * sinRotation) + ((vec[i].y + centerY) * cosRotation);

вместо

1