所以这就是问题所在:
给定线性阵列中指定的(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)?
答案 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)
。