4

我正在用 Java 构建俄罗斯方块,并尝试使用线性代数来旋转由 4 个瓷砖组成的一块。

我的朋友正在解释这样做的方法是:

他说:

“为了澄清,你确实需要旋转每个点——也就是说,你需要为一块中的每个瓷砖旋转一个点。但不是为一块中的每个瓷砖旋转四个角。原点就像你把铅笔穿过一个一张纸,把铅笔转了一圈……铅笔所在的地方就是原点。”

“所以,如果你的棋盘上有一个 T 牌,牌在 (7,9) (8,9) (9,9), (8,10),它的原点在 (8,9)..”

所以我用坐标 (1, 3) (1, 2) (1, 1) (2, 2)... 原点 (1, 2)

然后他说:

“您将 Tiles 转换为相对于原点。也就是说,您将原点视为此旋转的新 (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)

然后他说:

“现在使用旋转矩阵乘法旋转这四个坐标,就像我们一直在谈论的那样。”

在此处输入图像描述

最后他说:

“然后将原点坐标添加回每个结果坐标,现在你有了四个旋转的 Tile 坐标。”

从上面的矩阵中,我有 (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)

但是,看看我旋转的形状......这是完全错误的:

在此处输入图像描述

有什么想法为什么?

谢谢!

4

2 回答 2

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 回答
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 ]

这就是为什么它看起来是 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 回答