Java 使用x和y坐标创建二维栅格的一维阵列(x和y不是指二维栅格的行和列)

Java 使用x和y坐标创建二维栅格的一维阵列(x和y不是指二维栅格的行和列),java,arrays,Java,Arrays,假设我有一个网格是4x4瓦片。每个瓷砖为5x5像素。如何制作该网格的一维数组并正确设置瓷砖的坐标(我指定的坐标与二维数组的行和列不同)?例如,创建1d阵列后,索引4处的平铺具有以像素为单位的坐标(0,5) 假设您有一个尺寸为w和h的网格,其中每个磁贴都是一个大小为n的正方形。首先要考虑的是,每个瓦片的左上角(或左下角,取决于坐标系的方向)的坐标。(我将使用左上角作为(0,0)) 由于第一个磁贴从(0,0)开始,并且每个磁贴都是n像素宽和n像素,因此同一行中的下一个磁贴的坐标为(n,0),(2*n

假设我有一个网格是4x4瓦片。每个瓷砖为5x5像素。如何制作该网格的一维数组并正确设置瓷砖的坐标(我指定的坐标与二维数组的行和列不同)?例如,创建1d阵列后,索引4处的平铺具有以像素为单位的坐标(0,5)

假设您有一个尺寸为
w
h
的网格,其中每个磁贴都是一个大小为
n
的正方形。首先要考虑的是,每个瓦片的左上角(或左下角,取决于坐标系的方向)的坐标。(我将使用左上角作为
(0,0)

由于第一个磁贴从
(0,0)
开始,并且每个磁贴都是
n
像素宽和
n
像素,因此同一行中的下一个磁贴的坐标为
(n,0)
(2*n,0)
<代码>((w-1)*n,0)。这也适用于接下来的所有行。下一行的y偏移量为
n
像素,因此其坐标的形式为
(0,n)
(n,n)
(2*n,n)
,依此类推,直到到达具有起始坐标的最后一个磁贴
((w-1)*n,(h-1)*n)

接下来,您需要知道如何将二维阵列转换为一维阵列。 为此,考虑2D和1D阵列的索引是如何相关的:

2D-Array:
0: [0,1,2,3]
1: [0,1,2,3]
2: [0,1,2,3]
3: [0,1,2,3]
在1D阵列中,同样的情况如下所示:

1D-Array:
[(0,0),(1,0),(2,0),(3,0),(0,1),(1,1),(2,1),(3,1),(0,2),(1,2),(2,2),(3,2),(0,3),(1,3),(2,3),(3,3)]
2D数组的第一行适合索引
0-3
,下一行适合索引
4-7
,第三行适合索引
8-11
,第四行适合索引
12-15
。每个索引从
4(行大小)
乘以当前行索引开始,并由当前列索引偏移

因此,您可以应用以下公式来计算相应的1D索引(注意:这仅适用于矩形2D阵列,其中每行具有相同数量的元素):

测试2D阵列的
(1,1)

oneDIndex = (1 * 4) + 1 // == 5
如您所见,1D数组的索引
5
确实包含值
(1,1)

这意味着您可以使用以下代码将二维数组转换为一维数组:

for(int y = 0; y < twoDArray.length; y++) {
    for(int x = 0; x < twoDArray[y].length; x++) {
        int oneDIndex = (twoDArray[y].length * y) + x;
        oneDArray[oneDIndex] = twoDArray[y][x];
    }
}
gridCoordinate.x = tileCoordinate.x / tileSize;
gridCoordinate.y = tileCoordinate.y / tileSize;
考虑到网格大小
4*4
和磁贴大小
5*5
的具体问题,在坐标
(5,5)
处取磁贴。将其插入到上述代码段中会给出网格坐标
(1,1)
。这是正确的,因为您可以向右移动5个像素,向下移动5个像素,您将位于该网格索引处的平铺内

总而言之:

  • 将平铺坐标映射到栅格坐标
  • 使用栅格坐标计算一维数组中的索引
  • 将该平铺对象放入计算索引处的1D数组中
相反,如果您拥有1D索引并且需要相应的2D索引,则可以执行以下操作:

twoDYIndex = oneDIndex / gridSize;
twoDXIndex = oneDIndex % gridSize;
假设您希望在1D数组中索引
4
处的元素(如问题中所述)


因此,在二维数组中,这将是网格中的元素
(0,1)
,它位于坐标
(0,5)
,如有需要。

我是编程爱好者,请原谅我的错误。 我认为QBrute在上面的回答中有一个错误。2016年8月30日 它之所以有效,是因为它只考虑正方形数组,即4x4。 如果涉及矩形阵列(6 x 4),它将失败 我认为行
oneDIndex=(rowSize*rowIndex)+columnIndex

应该是
oneDIndex=(columnSize*rowIndex)+columnIndex

在一张纸上画出来,这样你就知道你想要什么了。那就很清楚了,为什么要使用一维数组呢?您只需创建一个2D数组,其中每个
平铺
对象的x和y坐标是数组索引的函数。如果你不太明白我说的话,请你澄清一下,因为我可以在回答中提供进一步的帮助。
twoDYIndex = oneDIndex / gridSize;
twoDXIndex = oneDIndex % gridSize;
twoDYIndex = 4 / 4 // == 1
twoDXIndex = 4 % 4 // == 0