VTK-不同类型的数据集

前言:本博文主要讲解vtk中不同类型的数据集以及它们之间的关系,如何进行转换等。

目录

vtkImageData

vtkRectilinearGrid

vtkStructuredGrid

vtkUnstructuredPoints

vtkPolyData

vtkUnstructuredGrid

vtkPolyData->vtkImageData

vtkPolyData->vtkUnstructuredGrid

vtkUnstructuredGrid->vtkPolyData

扫描二维码关注公众号,回复: 15959241 查看本文章

关于转换的接口:


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转换

猜你喜欢

转载自blog.csdn.net/qq_40041064/article/details/128641182
今日推荐