У меня есть класс tetronimo
(блок тетриса), который имеет четыре типа QRect
(названных first
, second
, third
, fourth
соответственно). Я рисую каждый тетронимо , используя функции типа build_tetronimo_L
.
Они строят тетронимо в определенном направлении, но, как и в тетрисе, вы должны иметь возможность вращать тетронимо, я пытаюсь вращать тетронимо, вращая каждый отдельный квадрат тетронимо.
Я нашел следующую формулу для применения к каждой (x, y) координате определенного квадрата.
newx = cos (угол) * oldx - грех (угол) * oldy
newy = sin (угол) * oldx + cos (угол) * oldy
Теперь тип Qt QRect
, похоже, имеет только функцию setCoords
, которая принимает (x, y) координаты в верхнем левом углу и в нижнем правом углу точек соответствующего квадрата.
У меня есть пример (который, кажется, не дает правильного результата) вращения первых двух квадратов в моем тетронимо.
Может кто-нибудь сказать мне, как я должен правильно вращать эти квадраты, используя расчет вращения во время выполнения?
void tetromino::rotate(double angle) // angle in degrees
{
std::map<std::string, rect_coords> coords = get_coordinates();
// FIRST SQUARE
rect_coords first_coords = coords["first"];
//top left x and y
int newx_first_tl = (cos(to_radians(angle)) * first_coords.top_left_x) - (sin(to_radians(angle)) * first_coords.top_left_y);
int newy_first_tl = (sin(to_radians(angle)) * first_coords.top_left_x) + (cos(to_radians(angle)) * first_coords.top_left_y);
//bottom right x and y
int newx_first_bl = (cos(to_radians(angle)) * first_coords.bottom_right_x) - (sin(to_radians(angle)) * first_coords.bottom_right_y);
int newy_first_bl = (cos(to_radians(angle)) * first_coords.bottom_right_x) + (sin(to_radians(angle)) * first_coords.bottom_right_y);
//CHANGE COORDINATES
first->setCoords( newx_first_tl, newy_first_tl, newx_first_tl + tetro_size,newy_first_tl - tetro_size);
//SECOND SQUARE
rect_coords second_coords = coords["second"];
int newx_second_tl = (cos(to_radians(angle)) * second_coords.top_left_x) - (sin(to_radians(angle)) * second_coords.top_left_y);
int newy_second_tl = (sin(to_radians(angle)) * second_coords.top_left_x) + (cos(to_radians(angle)) * second_coords.top_left_y);
//CHANGE COORDINATES
second->setCoords(newx_second_tl, newy_second_tl, newx_second_tl - tetro_size, newy_second_tl + tetro_size);
first
и second
являются QRect
типами. rect_coords
- это просто struct
с четырьмя int
с, в которых хранятся координаты квадратов.
Расчеты первого квадрата и второго квадрата разные, так как я пытался понять это.
Надеюсь, кто-нибудь поможет мне разобраться?
(Да, я могу сделать это намного проще, но я пытаюсь извлечь уроки из этого)