如何在使用扁平3D阵列时更改xyz顺序

时间:2016-11-05 02:47:01

标签: c++ c++11 visual-c++

我在我的程序中使用了扁平的3D数组,而且从我读过的所有内容中,访问它的方法是:array[x + width * (y + depth * z)] 这相当于array[x][y][z]
不幸的是,在我的代码中,我需要使用array[x][z][y]有没有人知道如何将展平的公式从xyz更改为xzy?

1 个答案:

答案 0 :(得分:0)

只要您在访问阵列时保持一致,您就可以随意访问它。 A"扁平" 3D数组现在只是一个普通的数组,索引对系统来说绝对没有意义。唯一的意思就是你在脑海中分配给他们的东西。

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

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

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

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

如果我们有任意数量的指数(即扁平的N维数组),推理就会一样。

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

只要您在使用映射函数(在所有方面,包括索引的顺序)中一致地访问同一个数组,您就可以了。