如何改变xyz顺序时,使用一个扁平的3D数组
How to change the xyz order when using a flattened 3D array
我为我的程序使用了一个扁平的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数组中的所有条目,不留洞(即不浪费内存,)等。
只要在访问同一个数组的任何地方使用映射函数保持一致(在所有方面,包括索引的顺序),就不会有问题。
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 如何使用条件计算 3D 网格中从一个点到另一个点的所有路径
- OPENCV是否有一个软件包将3D点转换为2D自上而下的视图
- 围绕另一个 3D 点旋转一个 3D 点
- 将分配给一个3D阵列
- Opengl 创建一个 3D 框而不是一个简单的三角形
- 在C++中循环遍历一个3d索引的1d数组
- 尝试创建一个 3D 矢量,该矢量将保留指向指向无符号字符的指针的指针
- 无法将一个 3D 矩阵转换为另一个 3D 矩阵
- 用C++制作一个简单的3D图形引擎有多难
- 在opengl- c++中创建一个3d游戏表面/游戏板
- 在openSceneGraph中设计一个3D房间
- 创建和迭代一个3D数组
- 如何改变xyz顺序时,使用一个扁平的3D数组
- 如何使用c++中的Eigen库创建一个高效的3D矩阵
- 使用一个动态分配的内存块创建2d或3d数组
- 在c++ 3D中计算一个矩形是否与一条射线相交
- 如何适应一个平面到一个3D点云
- 在c++中洗牌一个3d数组
- 输出一个3D数组的c++代码