在C++中循环遍历一个3d索引的1d数组
Looping through a 3d-indexed 1d array in C++
我创建了一个类,它通过将数据存储在1D数组中并重载() operator
来模仿3D布尔数组。我已经尝试了我能找到和想到的每一种方法,例如,当这段代码:
bool operator()(unsigned x, unsigned y, unsigned z) const { return _data[_zSize*_ySize*x + y*_ySize + z]; }
允许我访问我需要的每一个元素(我知道(x,y,z)实际上在这里(z,y,x),但这不取决于我),当我试图遍历数组时,我遇到了问题。考虑一个深度为3、高度为4、宽度为5的3D数组,其中每个元素都初始化为false。当我尝试反转数组中的所有值时(其中sx()
返回depth
、sy()
-height
、sz()
-width
)
for (unsigned i = 0; i < x.sx(); ++i)
for (unsigned j = 0; j < x.sy(); ++j)
for (unsigned k = 0; k < x.sz(); ++k)
x(i, j, k) = !x(i, j, k);
我得到以下结果(剩下的两个表面看起来相同):
11110
01110
01110
01111
因此,很明显,有些元素被访问和反转了两次。当我尝试不同的数组索引方法时,模式会发生变化。问题出在哪里?
正确的运算符是
bool operator()(unsigned x, unsigned y, unsigned z) const {
return _data[_zSize*_ySize*x + y*_zSize + z];
}
让我给出一个具有步长的泛化方法。假设您有一个3D阵列,并且访问是在(z,y,x)中完成的
通过这个索引,我假设矩阵维数为有z个平面,每个平面的大小是y,x,y宽,y高。
我们首先需要可视化三维结构以及我们将如何访问元素。
假设我们想要访问(3,4,1)
使用基于零的索引
这里,我们z=3,y=4,x=1,我们所需的平面是第4个平面,我们所需要的行是第4,所需要的元素是第1。
因此,进入所需平面:z*(平面大小)=z*(宽度*高度)
要转到所需行,行的y*sizeo=y*(高度)//或y*Row_bytes
要进入所需点,只需添加x*sizeof(一个点)//当每个点有3或4个值时,特定于多通道数据,例如Opencv 3通道数据。
因此,最终方程式将为
考虑3个通道数据,即每个大小为uchar的点3个值,
值=z*(宽*高)+y*(高)+x*(3*大小(uchar))
因此,一旦获得"值",就不会逐个提取每个像素值。
PS:3*sizeof(uchar)取代了OpenCV中常用的Vec3b版本,用于访问3通道uchar数据。
- 如何声明一个可以在整个程序中使用的全局 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中计算一个矩形是否与一条射线相交
- 在CGAL中确定一个点是在3D alpha形状曲面的内部还是外部
- 如何插值从Kinect计算的3D点来获得一个球的轨迹
- 如何适应一个平面到一个3D点云