首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用旋转矩阵的Java俄罗斯方块旋转

使用旋转矩阵的Java俄罗斯方块旋转
EN

Stack Overflow用户
提问于 2013-04-24 15:27:52
回答 2查看 1.1K关注 0票数 4

我正在用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)

但是看着我旋转的形状..。这完全是错误的

有什么想法吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)

但是你在数学(图像)中写下的矩阵是:

代码语言:javascript
运行
复制
[ -1 0 1 0 ]
[  0 0 0 1 ]

本来应该是:

代码语言:javascript
运行
复制
[ 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 +1E 216,1+E 1172E 218) (-1 +<代码>E 1191e 220,0+E 1212E 222)-返回原点(原点坐标为粗体) (1,1) (1,2) (1,3) (0,2) -结果点

票数 1
EN

Stack Overflow用户

发布于 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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16196039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档