我正在用Java构建俄罗斯方块,并试图使用线性代数来旋转一个由4块瓷砖组成的块。
我的朋友解释道:
,他说:
“要搞清楚,你确实需要旋转每一个点--也就是说,你需要对一块中的每块瓷砖旋转一个点。但对于一块中的每个瓷砖,不需要旋转四个角。原点就像你把一支铅笔穿过一张纸,绕着铅笔旋转。铅笔是原点的地方。” 因此,如果你的板上有一个T,瓷砖在(7,9) (8,9) (9,9),(8,10),而它的起源是(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),(8-8,10-9)或(-1,0) (0,0) (1,0) (0,1)(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)
但是看着我旋转的形状..。这完全是错误的
有什么想法吗?
谢谢!
发布于 2013-04-24 16:00:30
你有两个错误。
错误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) (1,2)
但是你真正应该做的是把它们添加到“起源”中。
(0,-1) (0,0) (0,1) (-1,0) -矩阵输出 (0 + 1,-1 + 2) (0 + 1,0+ 2) (0 +1
E 216
,1+E 117
2E 218
) (-1 +<代码>E 1191e 220
,0+E 121
2E 222
)-返回原点(原点坐标为粗体) (1,1) (1,2) (1,3) (0,2) -结果点
发布于 2013-04-24 15:43:42
我已经有一段时间没有做矩阵乘法了,但是你把你的点插入到矩阵中去旋转的顺序和你拔出的不一样。
您说剩下的是(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-10 0
作为要乘以的矩阵,我相信你最终得到了点(-1,0),(0,0),(1,0),(0,1)
https://stackoverflow.com/questions/16196039
复制相似问题