matrix - 绕枢轴旋转坐标? (俄罗斯方 block )

标签 matrix rotation tetris

我正在尝试设计我自己的俄罗斯方 block 克隆,但遇到了形状旋转的小问题。我有一个表示 10 x 20 游戏网格和单个形状对象的二维数组,这些对象在初始化时包含形状在网格上开始掉落的坐标。例如,当用户向下移动形状时,每个坐标的 y 值都会递减,并且此更改会反射(reflect)在网格上。

我似乎无法弄清楚使用此实现来处理形状旋转的有效方法。有什么方法可以使用这些围绕指定枢轴的坐标的矩阵吗?

如有任何建议,我们将不胜感激,

谢谢。

最佳答案

经典旋转矩阵是否有效,将取决于rotation system你想用。我将使用 SRS举个例子。

绕原点逆时针旋转的旋转矩阵为:

[0 -1]
[1  0]

现在,假设您有一个坐标列表 [(0, 1), (1, 1), (2, 1), (3, 1)] 代表 I block 的初始位置:

 0123
0....
1####
2....
3....

请注意,我不使用笛卡尔坐标系,而是使用通常的屏幕坐标,从左上角开始。要正确旋转 block ,首先必须考虑 y 轴的翻转。旋转矩阵则变为:

[ 0 1]  ->  x_new = y_old
[-1 0]  ->  y_new = -x_old

接下来,要围绕枢轴点旋转,在旋转之前,您必须移动坐标,使枢轴点成为原点(下面称为sb),并在旋转后将它们移回原点(下面称为 sa):

x_new = sa_x + (y_old - sb_x)
y_new = sa_y - (x_old - sb_y)

通常情况下,您会得到sb = sa,但对于俄罗斯方 block 来说,枢轴点有时位于两个单元格之间的网格上(对于 I block 和 O block ),有时位于一个单元格的中心。单元格(对于所有其他 block )。

事实证明

sa_x = 0
sb_x = 0
sa_y = 1
sb_y = me - 2

其中me是要旋转的 block 的最大范围(即2、3或4),适用于所有 block 。总而言之,你得到:

x_new = y_old
y_new = 1 - (x_old - (me - 2))

顺时针旋转类似,但如果您缓存所有 block 方向的坐标,则只需要一个方向。

对于其他旋转系统,移位变量的其他值可能有效,但您可能必须再次移动该 block ,具体取决于 block 的当前方向(将 SRS rotation 与 I block 的 DTET rotation 进行比较,以明白我的意思)。

关于matrix - 绕枢轴旋转坐标? (俄罗斯方 block ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457605/

相关文章:

java - 旋转开关 View 的剪辑

c# - 在 Unity 中以圆周运动控制/移动对象

ios - 如何将 mpMoviePlayerController 方向锁定为横向模式?

Java 俄罗斯方 block 旋转

c++ - 如何获取char C++的像素

C从带有科学记数法的文件中读取输入到二维数组中

matlab - 为什么列向量在用于索引矩阵时返回行向量?

html - 纯 HTML/CSS 的响应式俄罗斯方 block 板

android - Matrix中方法setSinCos的使用?

java - Java中两个矩阵相乘