c++ - C ++ VTK使用指针初始化卷
问题描述
我有一个 size 的体积NX x NY x NZ x NC
,其中NC = 3
是通道数,即体素的颜色。
该卷应使用 C++ 中的 VTK 可视化。但是,如果数据已经存储在内存中而不使用 4D 嵌套循环执行深度复制,我不知道如何在 VTK 中初始化卷。
以下代码应被视为伪代码,以了解所需的结果。
unsigned int NX = 100, NY = 100, NZ = 100, NC = 3;
float *volPtr = (float *)malloc(sizeof(float) * NX * NY * NZ * NC); // pointer to raw data
vtkNew<vtkVolume> vol; // or vtkNew<vtkStructuredGrid> vol;
// vol.setPointer(volPtr); // <- I need to find a way to do this
// EDIT: This makes arr point to volPtr without copying it.
// Maybe the vtkFloatArray can be converted to a volume.
vtkNew<vtkFloatArray> arr;
arr->SetArray(volPtr, NX * NY * NZ * NC, 1);
while (true) {
generate_data(volPtr); // dummy function to generate new data and write it to vol
// The VTK object 'vol' should now contain the new data as it points to volPtr
// Visualize the volume
// ...
}
解决方案
您应该创建一个vtkImageData
尺寸为[NX+1, NY+1, NY+1]
(它是每个方向上的点数,因此比体素多 1)
然后创建你的浮点数组。指定
arr->SetNumberOfComponents(3)
因为每个体素都是 3 个值的元组。还要指定一个名称。
接下来,将其添加到您的图像数据中CellData
:
image->GetCellData()->AddArray(arr)
最后,您可以可视化您的图像,例如使用体积渲染。
编辑
关于VTK数据结构
在 VTK 中,数据总是附加到网格上。网格是由单元链接的点列表。这vtkImageData
是一个结构化的规则网格,因此点和单元格是隐含的:您只需要提供维度来创建它。点是由坐标定义的数学点。体素是……体素:由 8 个点定义的立方体。
一个数据数组,这vtkFloatData
是将值与每个点或单元格相关联的方式。在您的情况下,每个体素都有 3 个组件(R、G 和 B),因此在内存中您应该有R0 G0 B0 R1 G1 B1 ... Rn Gn Bn
.
震级
如果您想要每个体素的幅度,您应该计算它(并将其添加到另一个中vtkFloatArray
)。
推荐阅读
- mongodb - 是否可以在 cosmos mongo db 上的多嵌套字段上创建索引?
- c++ - 有人可以解释为什么这段代码中的第二个输出是 a2a3 吗?
- api - 我想咨询一下 Google Drive 勒索软件相关的恢复
- vba - 在 MS Word 中使用公式识别/更改字段
- haskell - Haskell:将新类型视为字符串
- mysql - MySQL 说:#1064 - MySQL 触发器语法错误
- android - Parcelable 在将活动实例作为 putExtra 发送到另一个活动时遇到 IOException 写入可序列化对象错误
- google-analytics - 从 Google Analytics 切换到 Google Tagmanager
- javascript - 定义二维数组 Javascript
- c# - 将多个 byte[] 合并为一个多页 Base64