我有一个3d数组,它基本上是9个大块的2d数组,定义为100x100,它们将排列在3x3网格中。我想将这个3D数组转换为2D数组。
array [9] [100] [100]需要转向数组[900] [900]
关于我如何做到这一点的任何想法?
[编辑]
所以我要降低计数以使其更易于管理。我将使用数组[9] [5] [5];
如果我初始化阵列并打印到文件我使用下面的答案我没有得到我所期望的。鉴于我如何初始化,我期望和想要的是一个看起来像的文件:
000001111122222
000001111122222
000001111122222
000001111122222
000001111122222
333334444455555
333334444455555
333334444455555
333334444455555
333334444455555
666667777788888
666667777788888
666667777788888
666667777788888
666667777788888
所以我把价值与第一维度联系起来。它给了我9个象限的2D阵列。这是我想要的布局。因此,第一个维度实际上是定义了应放置其他2个维度的象限。所以重点是每个象限2D数组将保持tile id来绘制我们的地图。我想这样做是因为玩家将从中心(象限4)开始,但当他移动到象限5时,服务器(它是一个mmo)会看到它移动到中心象限的右边,所以它'我需要发送更多地图数据的整个右侧象限。
基本上它发送一个新的2,5和& 8象限的地图数据。我会相应地移动3D阵列(这点很简单。只需移动整个象限),然后转换为客户端上的2D数组,这样我就可以轻松找到我需要绘制的这个2D地图的哪个子部分因为我可以通过简单的数学找出2D阵列中玩家所处的确切瓦片。这给了我一个流媒体地图,它可以在服务器上很大,但只有在他们需要时发送给客户端的块。
for (j = 0; j < 5; j++)
{
for (k = 0; k < 5; k++)
{
a[0][j][k] = 0;
a[1][j][k] = 1;
a[2][j][k] = 2;
a[3][j][k] = 3;
a[4][j][k] = 4;
a[5][j][k] = 5;
a[6][j][k] = 6;
a[7][j][k] = 7;
a[8][j][k] = 8;
}
}
答案 0 :(得分:1)
只要您有m <= n; m > 0
,就可以将任何n维数组表示为m维数组。
任务仅仅是跟踪什么是什么,以及如何到达它。
在您的情况下,将array[9][100][100]
转换为二维数组可以按如下方式进行:
d1 = 0;
d2 = 0;
a = array[9][100][100];
b = array[2][9 * 100 * 100 / 2];
for (unsigned int i(0); i < 9; i++) {
for (unsigned int j(0); j < 100; j++) {
for (unsigned int k(0); k < 100; k++) {
b[d1][d2] = a[i][j][k];
d2++;
d1 = (d2 == 9 * 100 * 100 / 2) ? 1 : 0;
d2 = (d2 == 9 * 100 * 100 / 2) ? 0 : d2;
}
}
}
除此之外的任何内容都需要一个特殊的映射,您需要提供该映射,以便说明值a[i][j][k]
将存储在b[d1][d2]
中的哪个位置。
考虑到你的答案,我想这就是你要找的东西:
int d1 = 0;
int d2 = 0;
int a[9][100][100];
int b[300][300];
unsigned int i(0), j(0), k(0);
for (i = 0; i < 9; i++) {
for (j = 0; j < 100; j++) {
for (k = 0; k < 100; k++) {
b[d1 + j][d2 + k] = a[i][j][k];
}
}
d1 = (d1 + j == 300) ? 0 : d1 + j;
d2 = (d2 + k == 300) ? 0 : d2 + k;
}
问候!