Java 使用x和y坐标创建二维栅格的一维阵列(x和y不是指二维栅格的行和列)
假设我有一个网格是4x4瓦片。每个瓷砖为5x5像素。如何制作该网格的一维数组并正确设置瓷砖的坐标(我指定的坐标与二维数组的行和列不同)?例如,创建1d阵列后,索引4处的平铺具有以像素为单位的坐标(0,5) 假设您有一个尺寸为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
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数组中
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