我正在使用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)
但是,看看我的旋转形状......这是完全错误的:
有什么想法?
谢谢!
答案 0 :(得分:1)
我还没有在一段时间内完成矩阵乘法,但它看起来不像你将点插入要旋转的矩阵的顺序与你拉出的那个相同。
你说你留下了(0,-1)(0,0)(0,1)(-1,0)。这看起来像colums是你的点,顶部是你的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)
答案 1 :(得分: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度旋转,因为你乘以旋转矩阵两次。
您应该将所有输出点添加到原点。
你说:
从上面的矩阵中,我有(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) - 结果点