如何改变xyz顺序时,使用一个扁平的3D数组

How to change the xyz order when using a flattened 3D array

本文关键字:一个 3D 数组 改变 何改变 xyz 顺序      更新时间:2023-10-16

我为我的程序使用了一个扁平的3d数组,从我读到的所有内容来看,访问它的方式是:array[x + width * (y + depth * z)]这相当于array[x][y][z]
不幸的是,在我的代码中,我需要使用array[x][z][y]有人知道如何从xyz到xzy改变扁平公式吗?

只要您在访问数组时保持一致,您就可以随意访问它。一个"扁平"的3D数组现在只是一个普通的数组,索引对系统来说绝对没有意义。唯一的意义是你在心中赋予它们的意义。

因此,完全可以将该数组想象为(正如您所说的)XZY数组,而不是XYZ数组或索引的任何其他排列。一般公式是(当你把数组想象成一个扁平的3D数组时):

FlatIndex(1st, 2nd, 3rd) = 1st * PlaneSize + 2nd * RowSize + 3rd;

其中RowSize显然是一行元素的个数(即三维元素的个数),PlaneSize是一个平面的元素的个数,或者一行元素的个数乘以行数。

推导上面的公式很简单:如果你考虑元素是如何放在一起的,你会看到,当你将第三个索引增加1时,你也会将它的"地址"增加1(地址意味着它在1D数组中的位置),因此第三个索引的系数为1。当你把第二个索引增加1时,你实际上是在去下一行,你的地址一次增加了一行元素的值。换句话说,第二个索引的增量1与第三个索引的增量等于一行的大小相同,因此第二个索引的系数为RowSize。对于第一个索引也是如此。

如果我们有任意数量的索引(即一个扁平的n维数组),推理将是相同的。

但是这些都是虚的。你可以在3D数组中使用的三个索引和普通1D数组中使用的单个索引之间设计任何"映射"函数(有一些限制;例如,它必须覆盖你所有的领域,它必须是可逆的。)每个人使用的公式虽然是一个相当不错的:它是快速计算,它是1对1,这意味着它使用1D数组中的所有条目,不留洞(即不浪费内存,)等。

只要在访问同一个数组的任何地方使用映射函数保持一致(在所有方面,包括索引的顺序),就不会有问题。