将一维数组索引转换为三维数组索引?

4

我有一个整数,我想将其转换为三个整数,以便作为3D数组的索引,以下是我想说的示例。

byte[,,] array = new byte[XSize, YSize, ZSize];

int i = 0;

//other code

array[#,#,#] = cur;

//other code

我不知道如何从i中获取#,#,#的正确数字。

1
你能提供更多信息吗?你是想遍历所有项吗?还是尝试直接访问单个查找值的单个元素? - Jaime Torres
我的上一个评论仍然适用:您能提供输入和期望的输出吗? - Austin Salonen
1
@Lost 最好改进之前的问题,而不是发布新问题..... - Glory Raj
不,它不会让我删除它两天。 我想通过z、y、然后x循环遍历它。 例如,如果数组是[4,4,4],那么如果“i”是2,则索引将是[0,0,2],如果i是5,则索引将是[0,1,1]。 @James 是的,没错。 - Levi H
显示剩余2条评论
2个回答

16

假设你想要依次迭代 Z、Y 和 X...

int zDirection = i % zLength;
int yDirection = (i / zLength) % yLength;
int xDirection = i / (yLength * zLength); 

4

你需要对数组空间的方向进行假设。假设你正在将数字映射到0对应于0, 0, 0,并且你按照z,然后y,然后x进行迭代,那么数学计算就相当简单:

int x;
int y;
int z;

if (i < XSize * YSize * ZSize)
{
    int zQuotient = Math.DivRem(i, ZSize, out z);
    int yQuotient = Math.DivRem(zQuotient, YSize, out y);
    x = yQuotient % XSize;
}

请注意,这个方法比BlackVegetable的解决方案减少了一些冗余操作。对于一个(3, 3, 3)的矩阵,它会得到以下集合:
i (x, y, z)
0 (0, 0, 0)
1 (0, 0, 1)
2 (0, 0, 2)
3 (0, 1, 0)
4 (0, 1, 1)
5 (0, 1, 2)
6 (0, 2, 0)
7 (0, 2, 1)
8 (0, 2, 2)
9 (1, 0, 0)
10 (1, 0, 1)
11 (1, 0, 2)
12 (1, 1, 0)
13 (1, 1, 1)
14 (1, 1, 2)
15 (1, 2, 0)
16 (1, 2, 1)
17 (1, 2, 2)
18 (2, 0, 0)
19 (2, 0, 1)
20 (2, 0, 2)
21 (2, 1, 0)
22 (2, 1, 1)
23 (2, 1, 2)
24 (2, 2, 0)
25 (2, 2, 1)
26 (2, 2, 2)

此外,这可以通过 i = z + y * ZSize + x * ZSize * YSize 实现可逆转。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接