従来のローテーション マトリックスが機能する場合は、使用するローテーション システムによって異なります。例としてSRSを使用します。
原点を中心とした反時計回りの回転行列は次のとおりです。
[0 -1]
[1 0]
ここで、初期位置にある I ブロックを表す座標 [(0, 1), (1, 1), (2, 1), (3, 1)] のリストがあるとします。
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
が、テトリス ブロックの場合、ピボット ポイントは 2 つのセルの間のグリッド (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))
時計回りの回転も同様ですが、すべてのブロックの向きの座標をキャッシュすると、必要な方向は 1 方向だけになります。
他の回転システムでは、シフト変数の他の値が機能する可能性がありますが、ブロックの現在の方向に応じて、ピースを再度シフトする必要がある場合があります ( SRS 回転をI ブロックのDTET 回転と比較して、私の意味を確認してください) .