Если классические матрицы вращения будут работать, будет зависеть от системы вращения , которую вы хотите использовать. Я буду использовать SRS в качестве примера.
Матрица вращения для вращения против часовой стрелки вокруг начала координат:
[0 -1]
[1 0]
Теперь предположим, что у вас есть список координат [(0, 1), (1, 1), (2, 1), (3, 1)], представляющих I-блок в его начальной позиции:
0123
0....
1####
2....
3....
Обратите внимание, что я использую не декартову систему координат, а обычные экранные координаты, начиная с верхнего левого угла. Чтобы правильно повернуть блок, сначала нужно учесть изменение оси y. Матрица вращения становится:
[ 0 1] -> x_new = y_old
[-1 0] -> y_new = -x_old
Затем, чтобы вращаться вокруг точки поворота, перед вращением необходимо сместить координаты, чтобы точка поворота стала исходной точкой (называемой sb
ниже), и сдвинуть их назад после вращения (называемой sa
ниже). ):
x_new = sa_x + (y_old - sb_x)
y_new = sa_y - (x_old - sb_y)
Обычно у вас было бы sb = sa
, но для блоков тетриса точка разворота иногда находится на сетке между двумя ячейками (для I- и O-блоков) и иногда в центре ячейки (для всех других блоков) .
Оказывается,
sa_x = 0
sb_x = 0
sa_y = 1
sb_y = me - 2
, где me
- это максимальная протяженность (то есть 2, 3 или 4) блока для поворота, работает для всех блоков. Итак, подведя итог, вы получите:
x_new = y_old
y_new = 1 - (x_old - (me - 2))
Вращение по часовой стрелке аналогично, но если вы кешируете координаты для всех для ориентаций блоков, вам понадобится только одно направление.
Для других систем вращения могут работать другие значения переменных сдвига, но вам, возможно, придется снова сдвигать часть, в зависимости от текущей ориентации блока (сравните Вращение SRS с Вращение DTET I-блока, чтобы понять, что я имею в виду).