在2D阵列中旋转块

时间:2012-02-22 23:45:53

标签: java rotation coordinate-systems

我正在制作类似于着名游戏俄罗斯方块的程序,在旋转块时我遇到了一些问题。

我知道你可以通过使用“x = -y”和“y = x”来旋转坐标系中的数字,但问题是因为我使用整数数组来表示它所做的事情更难。

我的数组看起来像:

int[][] space = new int[20][10];

如果一个坐标包含一个块,则该值为1,否则为0。

那么如何在不占用负数的情况下旋转该空间中的块呢?

2 个答案:

答案 0 :(得分:2)

这是一个示例文章(使用0和1重用 int [] [] ,这可能是使用布尔数组完成的):

private static final int[][] piece = new int[][] {
        { 0, 1, 0, },
        { 1, 1, 1, },
};

你可以旋转一块这样做:

private static int[][] rotate( final int[][] piece ) {
    final int[][] res = new int[piece[0].length][piece.length];
    for (int x = 0; x < piece.length; x++) {
        for (int y = 0; y < piece[0].length; y++) {
            res[(res.length-1)-y][x] = piece[x][y];
        }
    }
    return res;
}

起始篇:

010
111

这是 rotate(piece)

01
11
01

这是旋转(旋转(片段))

111
010

这里是旋转(旋转(旋转(片段)))

10
11
10

答案 1 :(得分:0)

如果我已经正确理解了这一点,你可以通过对坐标应用固定的偏移量来做到这一点。偏移量是您想要旋转的中心。

int oldSpace[][] = new int[20][10];
int newSpace[][] = new int[20][10];
int offX = 10;
int offY = 5;
for(int x = -5; x < 5; x++) {
  for(int y = -5; y < 5; y++) {
    newSpace[offX+x][offY+y] = oldSpace[offX-y][offY+x];
  }
}

我假设20是X维度,10是Y维度。这会围绕坐标(10,5)旋转10x10块。请注意,我只在中间旋转了一个10x10的块,因为这是两个空格之间的重叠。也许您正在将[20] [10]数组复制到[10] [20]数组,在这种情况下,您可以增加y的范围,使其从-10到9运行。

编辑:对不起,如果你有一个不同形状的输出数组,你还需要一组不同的偏移,因为(10,5)将不再位于中心。但你应该能够弄清楚这一点。