给定线性数组中指定的 (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)
?
对于每个x
,都有 10 个元素y
。对于每个y
,都有 10 个元素z
。从这个意义上说,z
它是一种迭代器,它给出了数组中最小的增量。每次z
递增10*10次,x
递增一次:
//x = i/(dim(y)*dim(z)) % dim(x)
x = i/(10*10) % 10 //integer division
同样 for y
,但是z
只需要增加 10 次 fory
就可以增加。
//y = i/dim(z) % dim(y)
y = i/(10) % 10 //integer division
最后,z
每当增加时总是增加z
(这听起来很愚蠢,但我试图从其他两个过程中遵循我的过程。我想说的是,z
当迭代器增加时它总是会增加)。
//z = i % dim(z)
z = i % 10
编辑:dim()
应该返回指定维度的大小。在这个例子中它的名字很糟糕,对此我深表歉意。
在以下算法中使用整数除法/
和模函数(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)
。