1

给定线性数组中指定的 (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)

4

2 回答 2

1

对于每个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()应该返回指定维度的大小。在这个例子中它的名字很糟糕,对此我深表歉意。

于 2013-06-07T21:17:27.650 回答
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)

于 2019-08-04T20:51:28.433 回答