4

私は Java で Tetris を構築しており、線形代数を使用して 4 つのタイルで構成されるピースを回転させようとしています。

私の友人は、その方法を次のように説明していました。

彼は言った:

「明確にするために、各ポイントを回転させる必要があります。つまり、ピース内の各タイルに対して 1 つのポイントを回転させる必要があります。ただし、ピース内の各タイルの 4 つの角ではありません。原点は、一枚の紙と鉛筆をぐるぐる回す..鉛筆がある場所が原点です。」

「つまり、(7,9) (8,9) (9,9), (8,10) にタイルがあるボードに T があり、その原点が (8,9).. である場合。」

だから私は座標 (1, 3) (1, 2) (1, 1) (2, 2)… 原点 (1, 2) でそれをやっています

それから彼は言った:

「タイルを原点に相対的に変換します。つまり、この回転の新しい (0, 0) として原点を扱います。これは、各座標から原点を差し引くだけで簡単で、(7-8, 9-9)、(8-8、9-9)、(9-8、9-9)、(8-8、10-9) または (-1、0) (0、0) (1、0) ) (0, 1)"

各座標から原点 (1, 2) を引きます

(1-1, 3-2) (1-1, 2-2) (1-1, 1-2) (2-1, 2-2) =

(0, 1) (0, 0) (0, -1) (1, 0)

それから彼は言った:

「これまで話してきたように、回転行列の乗算を使用してこれら 4 つの座標を回転させます。」

ここに画像の説明を入力

最後に彼は言った:

「次に、結果の各座標に原点座標を追加すると、4 つの回転したタイル座標が得られます。」

上記の行列から、私は (0, -1) (0, 0) (0, 1) (-1, 0) を持っています. (1+0, 2+0) (1+0, 1+1) (2-1, 2+0) =

回転座標: (0, 3) (1, 2) (1, 2) (1, 2)

しかし、回転した形状を見ると...完全に間違っています:

ここに画像の説明を入力

なぜ何か考えはありますか?

ありがとう!

4

2 に答える 2

1

あなたには2つの間違いがあります。

間違い 1:

次の計算を行います。

(1-1, 3-2) (1-1, 2-2) (1-1, 1-2) (2-1, 2-2) =

(0, 1) (0, 0) (0, -1) (1, 0)

しかし、実際に数学で書き留めた行列 (画像) は次のとおりです。

[ -1 0 1 0 ]
[  0 0 0 1 ]

あるべきとき:

[ 0 0  0 1 ]
[ 1 0 -1 0 ]

回転行列を 2 回乗算したため、180 度の回転に見えるのはそのためです。

間違い 2:

すべての出力ポイントを原点に追加する必要があります。

あなたが言った:

上記の行列から、私は (0, -1) (0, 0) (0, 1) (-1, 0) を持っているので、彼が言うように、これらを原点座標に追加します (1-1, 3+0) (1+0, 2+0) (1+0, 1+1) (2-1, 2+0) = (0, 3) (1, 2) (1, 2) (1, 2)

しかし、実際にすべきことは、それらを ORIGIN に追加することです。

(0, -1) (0, 0) (0, 1) (-1, 0) - マトリックス出力

(0 + 1 , -1 + 2 ) (0 + 1 , 0 + 2 ) (0 + 1 , 1 + 2 ) (-1 + 1 , 0 + 2 ) - 原点を追加します (太字の原点座標)

(1, 1) (1, 2) (1, 3) (0, 2) - 結果のポイント

于 2013-04-24T16:00:30.737 に答える
1

しばらく行列の乗算を行っていませんが、回転する行列にポイントを挿入した順序が、引き出した順序と同じではないようです。

(0, -1) (0, 0) (0, 1) (-1, 0) が残っていると言います。これは、列がポイントで、上の列が x で、下の列が y のように見えます。最初のポイントのセットで同じ規則を使用した場合、回転行列を掛けた行列は (-1, 0) (0, 0) (1, 0) (0, 1) ではありません。あなたが始めたポイントのセット。

ポイント (0, 1) (0, 0) (0, -1) (1, 0) から始めたので、次の行列を使用します。

| | 0 0 0 1 |
| | 1 0 -1 0 |

乗算される行列として、ポイント (-1,0)、(0,0)、(1,0)、(0,1) になると思います

于 2013-04-24T15:43:42.770 に答える