如何在线性3D数组中给出索引的x,y,z值

时间:2013-06-07 00:50:28

标签: arrays 3d linear

所以这就是问题所在:

给定线性阵列中指定的(10,10,10)的3D空间:

[10x10x10]

而不是

[10] [10] [10]

我理解如何通过执行以下操作获得[x] [y] [z]的索引:

[x +(y * W))+(z * W * H)]

[x +(y * 10))+(z * 10 * 10)]

我的问题是如何逆转。如果我有索引[i]我该如何找到(x,y,z)?

2 个答案:

答案 0 :(得分:1)

对于每个x,有y的10个元素。对于每个y,有z的10个元素。从这个意义上说,z是一种迭代器,它给出了数组中最小的增量。每次z递增10 * 10次,x递增一次:

//x = i/(dim(y)*dim(z)) % dim(x)
x = i/(10*10) % 10 //integer division

同样适用于y,但z只需增加10倍y即可增加。

//y = i/dim(z) % dim(y)
y = i/(10) % 10 //integer division

最后,只要z递增,z总是递增(这听起来很愚蠢,但我试图从其他两个中继续我的过程。我想说的是{{1}当迭代器递增时,它将一直递增。)

z

编辑://z = i % dim(z) z = i % 10 应返回指定尺寸的大小。在这个例子中命名很差,我为此道歉。

答案 1 :(得分:0)

在以下算法(C风格代码)中使用整数除法/和模函数%

// find indexes `i`,`j`,`k` from the flat index `q`
// dimensions n,m,l (i=0..n-1, j=0..m-1, k=0..l-1)
// memory is layout is last index `i` changing fastest
// q = i + n*( j + m*k )

i = q % n;  
q = q / n;
j = q % m; 
i = q / m;

每个问题示例

(7,3,5)处的元素的索引为q = 7+10*(3+10*5) = 537

i = 537 % 10 = 7
537 / 10 = 53
j =  53 % 10 = 3
k =  53 / 10 = 5  

所以(i,j,k)=(7,3,5)