首页 > 解决方案 > 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
    // ...
}

标签: c++pointersvtk

解决方案


您应该创建一个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)。


推荐阅读