c++ VTK使用指针初始化卷



我有一个大小为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
// ...
}

你应该创建一个尺寸为[NX+1, NY+1, NY+1]vtkImageData(它是每个方向上的点的数量,所以比体素多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中添加它)。