前言:本博文主要讲解vtk中不同类型的数据集以及它们之间的关系,如何进行转换等。
目录
vtkImageData
vtkRectilinearGrid
vtkStructuredGrid
vtkUnstructuredPoints
vtkPolyData
vtkUnstructuredGrid
vtkPolyData->vtkImageData
vtkPolyData->vtkUnstructuredGrid
vtkUnstructuredGrid->vtkPolyData
关于转换的接口:
vtk中数据集由组织结构和数据数据组成。组织结构又分为拓扑结构和几何结构,不同的组织结构对应不同类型的数据集。
vtkImageData
描述:vtkImageData类型是按规则排列在矩形方格中的点和单元的集合。如上图a所示。
vtkRectilinearGrid
描述:vtkRectilinearGrid类型的数据是排列在矩形方格中的点和单元的集合。如上图b所示。线性结构的拓扑结构是规则的,但其几何结构只有部分是规则的。
vtkStructuredGrid
描述:结构化网格数据,具有规则的拓扑结构和不规则的几何结构,但是单元没有重叠或交叉。如上图c所示。结构化网格的单元是由四边形或六面体组成,通常用于有限元分析。
vtkUnstructuredPoints
描述:非结构化点集是指不规则地分布在空间的点集。其具有不规则的几何结构,不具有拓扑结构。非结构化点集用离散点来表达。如上图d所示。
vtkPolyData
描述:vtkPolyData(多边形数据结构)由顶点(vertex)、多顶点(Polyvertex)、线(Line)、折线(PolyLine)、三角形条带(TriangleStrip)等单元构成。如上图e所示。
vtkUnstructuredGrid
描述:非结构化网格数据,是最常见的数据集类型,它的拓扑结构和几何结构都是非结构化的,所有单元类型都可以任意组合,所有单元的拓扑结构从零维延伸至三维。如上图f所示。在VTK中,任一类型的数据集都可用非结构化网格来表达,但其储存需要大量的空间,计算时需要消耗大量的资源,除非迫不得已,一般较少使用此种类型的数据集。主要用于有限元分析,计算几何和图形表示等领域。
详细请见VTK-数据集vtkUnstructuredGrid_雪易的博客-CSDN博客
vtkPolyData->vtkImageData
vtkPolyData* pd = ...
vtkNew<vtkImageData> whiteImage;
double bounds[6];
pd->GetBounds(bounds);
double spacing[3]; // 所需的体积间距
spacing[0] = 0.5;
spacing[1] = 0.5;
spacing[2] = 0.5;
whiteImage->SetSpacing(spacing);
// 计算尺寸
int dim[3];
for (int i = 0; i < 3; i++) {
dim[i] = static_cast<int>(ceil((bounds[i * 2 + 1] - bounds[i * 2]) / spacing[i]));
}
whiteImage->SetDimensions(dim);
//whiteImage->SetExtent(0, dim[0] - 1, 0, dim[1] - 1, 0, dim[2] - 1);
//whiteImage->SetExtent(0, 500, 0, 500, 0, 500);
double origin[3];
// origin[0] = bounds[0] + spacing[0] / 2;
// origin[1] = bounds[2] + spacing[1] / 2;
// origin[2] = bounds[4] + spacing[2] / 2;
origin[0] = -100 + bounds[0] + spacing[0] / 2;
origin[1] = -100 + bounds[2] + spacing[1] / 2;
origin[2] = bounds[4] + spacing[2] / 2;
whiteImage->SetExtent((bounds[0] - origin[0]) / spacing[0], (bounds[0] - origin[0]) / spacing[0] + dim[0] - 1,
(bounds[2] - origin[1]) / spacing[1], (bounds[2] - origin[1]) / spacing[1] + dim[1] - 1,
(bounds[4] - origin[2]) / spacing[2], (bounds[4] - origin[2]) / spacing[2] + dim[2] - 1);
whiteImage->SetOrigin(origin);
whiteImage->AllocateScalars(VTK_SHORT, 1);
// 用前景体素填充图像:
unsigned char inval = 255;
vtkIdType count = whiteImage->GetNumberOfPoints();
for (vtkIdType i = 0; i < count; ++i) {
whiteImage->GetPointData()->GetScalars()->SetTuple1(i, inval);
}
// 多边形数据->图像模具:
vtkNew<vtkPolyDataToImageStencil> pol2stenc;
pol2stenc->SetInputData(pd);
pol2stenc->SetOutputOrigin(origin);
pol2stenc->SetOutputSpacing(spacing);
pol2stenc->SetOutputWholeExtent(whiteImage->GetExtent());
pol2stenc->Update();
auto imgstenc = vtkSmartPointer<vtkImageStencil>::New();
imgstenc->SetInputData(whiteImage);
imgstenc->SetStencilConnection(pol2stenc->GetOutputPort());
imgstenc->ReverseStencilOn();
imgstenc->SetBackgroundValue(0);
imgstenc->SetBackgroundColor(0, 0.8, 1.0, 0.5);
imgstenc->Update();
vtkPolyData->vtkUnstructuredGrid
vtkPolyData * pd = ...
vtkUnstructuredGrid * unSGrid = vtkUnstructuredGrid::New();
unSGrid->ShallowCopy(pd);
vtkUnstructuredGrid->vtkPolyData
vtkUnstructuredGrid* unSGrid = ...
vtkDataSetSurfaceFilter * filter = vtkDataSetSurfaceFilter::New();
filter->SetInputData(unSGrid);
filter->Update();
vtkPolyData* pd = filter->GetOutput();
关于转换的接口:
vtkPolyDataToImageStencil
vtkImageDataToUniformGrid
vtkUnstructuredGridToExplicitStructuredGrid
参考:VTK图形图像开发进阶
Study-VTK:PolyData 和 UnstructuredGrid 相互转换_Beyond欣的博客-CSDN博客_vtkunstructuredgrid转换