1

我正在寻找有关设计一个类以管理 6x6 网格中 3 个项目的位置的最有效方法的一些指导。网格上的项目不能移动/改变它们的位置,但是,整个网格可以顺时针/逆时针旋转 90 度,并且可以根据用户对网格的触摸/拖动操作在 iOS 上实时水平/垂直翻转设备。由于旋转和/或翻转整个网格,网格中的 3 个项目将基于未旋转的“位置参考”网格处于不同的“绝对”位置。在网格的每次“转换”之后,我试图以最有效的方式确定这些新项目的位置。

为了说明我要完成的工作,请考虑以下内容...我正在对网格中左上角为位置 0 的位置进行编号,并且数字向右然后向下递增:

位置参考网格:

-------------------------
| 0 | 1 | 2 | 3 | 4 | 5 |
-------------------------
| 6 | 7 | 8 | 9 | 10| 11|
-------------------------
| 12| 13| 14| 15| 16| 17|
-------------------------
| 18| 19| 20| 21| 22| 23|
-------------------------
| 24| 25| 26| 27| 28| 29|
-------------------------
| 30| 31| 32| 33| 34| 35|
-------------------------

我计划始终使用此编号来引用项目在网格中的位置,而不管应用到网格的任何旋转/翻转变换。因此,例如,如果我在位置 A=7、B=9、C=14 中有项目

原来的:

-------------------------
| 0 | 1 | 2 | 3 | 4 | 5 |
-------------------------
| 6 | A | 8 | B | 10| 11|
-------------------------
| 12| 13| C | 15| 16| 17|
-------------------------
| 18| 19| 20| 21| 22| 23|
-------------------------
| 24| 25| 26| 27| 28| 29|
-------------------------
| 30| 31| 32| 33| 34| 35|
-------------------------

并将网格顺时针旋转 90 度,新项目位置将为 A=10、B=22、C=15。

顺时针旋转 90 度:

-------------------------
| 0 | 1 | 2 | 3 | 4 | 5 |
-------------------------
| 6 | 7 | 8 | 9 | A | 11|
-------------------------
| 12| 13| 14| C | 16| 17|
-------------------------
| 18| 19| 20| 21| B | 23|
-------------------------
| 24| 25| 26| 27| 28| 29|
-------------------------
| 30| 31| 32| 33| 34| 35|
-------------------------

网格只有 8 种可能的方向(每侧 0、90、180、270 度),因此根据网格的方向,每个项目正好有 8 个已知位置。因此,我可以硬编码 8 个 3 项数组,其中包含 8 个方向中每一个方向的 3 项的绝对位置——每个方向一个数组。一旦我知道经过一些变换后网格的方向,我可以简单地获取与网格方向对应的正确的 3 项位置数组,以获得 3 项的新位置。

由于我需要一次对多个网格进行此位置检索,因为网格转换直接响应 iOS 上的触摸操作,并且由于网格中可能有更多项目,我想知道这种硬编码是否是如果发生网格旋转或翻转,是否有更精细的方法来计算或以其他方式动态确定网格中项目的位置。

非常感谢任何建议、意见、建议。

提前致谢!

4

1 回答 1

0

从重新编号网格位置开始:不要使用带有单元格编号的直通编号方案,而是使用带有一(row, column)对的两个编号方案。通过简单的数学运算,您可以轻松地在两种方案之间来回切换。使棋盘的中心成为(0,0)。那么您的点将位于位置A=(3,-3)B=(3,1)C=(1,-1)

有了这个编号方案,请注意项目的位置可以由三件事确定:

  • 原来的(row, column)
  • 旋转(0 - 0°、1 - 90°、2 - 180°、3 - 270°)
  • 沿水平轴的翻转(0 - 不翻转,1 - 翻转)

沿垂直轴翻转表示为沿水平轴翻转,然后旋转 180°。

翻转坐标很容易:更改 的符号column,同时保持行不变。您的点的翻转位置将是A=(3,3)B=(3,-1)C=(1,1)

进行旋转的一种常用方法是将坐标的列向量左乘以旋转矩阵

左乘:

以下是执行 90°、180° 和 270° 旋转的矩阵列表:

旋转 90° 旋转 180° 旋转 270°

于 2013-08-14T00:54:12.917 回答