如何旋转2D整数数组

时间:2009-03-14 18:45:45

标签: c# c++ arrays math

我正在编写一个俄罗斯方块克隆,在我的游戏中,我将我的tetromino块存储为4x4块阵列。我现在需要能够旋转数组中的整数位置,以便我得到一个旋转的tetris块。我不能简单地旋转纹理,因为我的所有碰撞检测等都被设计为与2D数组一起使用。游戏是用CNA用CNA编写的。

我怎么可能顺时针/逆时针旋转我的2D数组的整数90度。

以下是我的'L'块存储的示例。

0 1 0 0
0 1 0 0
0 1 1 0 
0 0 0 0

感谢您的帮助。

7 个答案:

答案 0 :(得分:29)

如果它们是2D数组,则可以通过使用不同的数组访问顺序进行复制来实现旋转。

即,顺时针旋转,请尝试:

int [,] newArray = new int[4,4];

for (int i=3;i>=0;--i)
{
    for (int j=0;j<4;++j)
    {
         newArray[j,3-i] = array[i,j];
    }
}

逆时针方向类似。

答案 1 :(得分:11)

请勿使用代码旋转碎片。只需存放一组不同的片段方向,并在片段旋转时循环播放。没有必要在俄罗斯方块游戏中动态旋转它们。

由于问题域是俄罗斯方块,你会发现旋转算法会导致不良影响,例如长薄的Tetronimo不会在两个位置之间交替(就像它在真实场景中那样)。

答案 2 :(得分:6)

在经典的俄罗斯方块中,对象的排列很少。我只想在4个位置的每个位置为每个“tetromino”设置一个常量数组,并根据输入选择合适的数组。

为什么浪费CPU周期试图旋转呢?

答案 3 :(得分:4)

如果要旋转4 x 4块,只需移动位置:

A B C A
C D D B
B D D C
A C B A

每个A移动到下一个A,B,C和D相同。

   /-----\
   |     |
   |     V
   A B C A
/->C D>D B--\
|  B D D C  |
|  A C B A  |
|    | ^    |
|    | |    |
\----/ \----/     

答案 4 :(得分:1)

我存储“单元格”的(x,y)坐标,并使用旋转矩阵旋转它们。 例如,请参阅Drawing a Rotated Rectangle。您可能必须将结果舍入到最接近的0.5增量。

答案 5 :(得分:0)

顺时针和逆时针的js代码:

function arrRotation90(arr, clockwise) {
            var arr_rotated = [];
            for (var i = 0; i < arr[0].length; i++) {
                arr_rotated[i] = [];
            }
            if (clockwise) {
                for (var i = 0; i < arr.length; i++) {
                    for (var j = 0; j < arr[i].length; j++) {
                        arr_rotated[arr[i].length-1-j][i] = arr[i][j];
                    }
                }
            } else {
                for (var i = 0; i < arr.length; i++) {
                    for (var j = 0; j < arr[i].length; j++) {
                        arr_rotated[j][arr.length - 1 - i] = arr[i][j];
                    }
                }
            }
            return arr_rotated;
        }

答案 6 :(得分:0)

int[,] source = { { 1,2,3 }, {4,5,6 }, { 7,8,9} };
int[,] result = new int[3,3];
var rows = source.GetLength(0);
var cols = source.GetLength(1);

for (var r=0; r<rows; r++)
{
    for (var c = 0; c < cols; c++)
    {
        result[r, c] = source[rows - 1 - c, r];
    }
}