我正在用Java构建俄罗斯方块游戏,试图使用线性代数来旋转由4个小方块组成的方块。
我的朋友解释了如何实现:
他说:“需要澄清的是,您确实需要旋转每个点 - 也就是说,您需要为方块中的每个小方块旋转一个点。但不是为方块中的每个小方块旋转四个角落。原点就像是您将一支铅笔插入纸片并围绕着旋转... 铅笔所在的位置就是原点。”
所以我用坐标(1,3)(1,2)(1,1)(2,2)... 并且原点为(1,2)。
然后他说:“您将小方块移动到相对于原点的位置。也就是说,您将原点视为此旋转的新(0,0)。这很容易,只需从每个坐标中减去原点即可,得到(-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)
然后他说:“现在使用旋转矩阵乘法旋转这四个坐标,就像我们一直在讨论的那样。”
最后他说:“然后将原始坐标添加回每个结果坐标中,现在您就有了旋转后的四个小方块坐标。”
从上面的矩阵中,我得到(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,3)(1,2)(1,1)(2,2)... 并且原点为(1,2)。
然后他说:“您将小方块移动到相对于原点的位置。也就是说,您将原点视为此旋转的新(0,0)。这很容易,只需从每个坐标中减去原点即可,得到(-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)
然后他说:“现在使用旋转矩阵乘法旋转这四个坐标,就像我们一直在讨论的那样。”
最后他说:“然后将原始坐标添加回每个结果坐标中,现在您就有了旋转后的四个小方块坐标。”
从上面的矩阵中,我得到(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, 1) (1, 2) (1, 3) (0, 2)
是从我的原始输入(1, 3) (1, 2) (1, 1) (2, 2)
中作为坐标(x, y)而不是(行, 列)得出的...它所做的只是将块水平翻转180度...我不明白这是怎么可能的,因为我的乘法矩阵是R(90度),而不是R(180度)。为什么会这样? - user3871