zoukankan      html  css  js  c++  java
  • VTK 基本数据结构_如何把几何结构&拓扑结构加入到数据集

    1. 无拓扑结构

    只有几何结构,没有拓扑结构的vtkDataSet

     1 #include <vtkAutoInit.h>  
     2 VTK_MODULE_INIT(vtkRenderingOpenGL); 
     3  
     4 #include <vtkSmartPointer.h>
     5 #include <vtkPointData.h>
     6 #include <vtkPolyData.h>
     7 #include <vtkPolyDataWriter.h>
     8  
     9 int main()
    10 {
    11     //创建几何数据,没有拓扑数据
    12     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    13     points->InsertNextPoint(1.0,0.0,0.0);
    14     points->InsertNextPoint(0.0,0.0,0.0);
    15     points->InsertNextPoint(0.0,1.0,0.0);
    16  
    17     //把几何数据(拓扑数据为空)放入到某个数据集中
    18     vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    19     polydata->SetPoints(points);
    20  
    21     //将polydata类型的数据写到一个vtk文件中
    22     vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
    23     writer->SetFileName("PolyData.vtk");
    24     writer->SetInputData(polydata);
    25     writer->Write();
    26  
    27     return 0;
    28 }
    首先 创建了一个点数据(vtkPoints),里面含有三个点;紧接着 创建了一个类型为vtkPolyData的数据集,vtkPolyData派生自类vtkPointSet,而vtkPointSet又派生自vtkDataSet,所以说vtkPolyData是一种具体的数据集; 然后将创建的点数据加入到数据集,于是点数据就定义了该数据集的几何;最后把vtkPolyData的数据用类vtkPolyDataWriter写入到PolyData.vtk文件。
    利用Notepad++打开文件,利用ParaView可视化如下:
         

    2. 零维拓扑结构及实验

    给数据集定义一维拓扑结构——顶点。
     1 #include <vtkAutoInit.h>  
     2 VTK_MODULE_INIT(vtkRenderingOpenGL); 
     3  
     4 #include <vtkSmartPointer.h>
     5 #include <vtkPoints.h>    //几何结构
     6 #include <vtkPolyData.h>  //数据集
     7 #include <vtkPolyDataWriter.h>
     8 #include <vtkCellArray.h> //拓扑结构
     9  
    10 int main()
    11 {
    12     //创建点坐标
    13     int X[3] = {1.0,0.0,0.0};
    14     int Y[3] = {0.0,0.0,0.0};
    15     int Z[3] = {0.0,1.0,0.0};
    16  
    17     //创建点数据&创建使每一个点加入类似顶点类型的Cell
    18     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    19     vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();
    20     for (unsigned int i=0; i<3; i++)
    21     {
    22         //定义用来存储点索引的中间变量,vtkIdType相当int long等类型
    23         vtkIdType pId[1];
    24         //把点坐标加入VTKPoints中,InserNextPoint()返回加入点的索引;
    25         //使用这个索引号创建定点类型Cell
    26         pId[0] = points->InsertNextPoint(X[i],Y[i],Z[i]);
    27         
    28         //每个坐标点都需要创建一个顶点Cell
    29         vertics->InsertNextCell(1,pId);
    30     }
    31     //创建VTKPolyData对象
    32     vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    33     //将几何结构 & 拓扑结构加入到数据集中
    34     polydata->SetPoints(points);
    35     polydata->SetVerts(vertics);
    36     //写数据、
    37     vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
    38     writer->SetFileName("TopoGeometry.vtk");
    39     writer->SetInputData(polydata);
    40     writer->Write();
    41  
    42     return 0;
    43 }

    与实验一不同之处在于该程序实例化了一个vtkCellArray的对象,前文说“点数据(Point Data)定义数据集的几何结构,单元数据(Cell Data)定义数据集的拓扑结构”。所以,vtkCellArray类型的对象vertices就是用来指定数据集polydata的拓扑结构,而polydata的几何结构则是由points来定义的。
    此处定义的数据集的拓扑结构是零维的点,即单元类型是Vertex(顶点)。

    利用Notepad++打开文件,利用ParaView可视化如下:

         

    3. 一维拓扑结构及实验

    在上例的基础上做一些更改,将零维的点拓扑结构改成一维的线拓扑结构。

     1 #include <vtkAutoInit.h>  
     2 VTK_MODULE_INIT(vtkRenderingOpenGL); 
     3  
     4 #include <vtkSmartPointer.h>
     5 #include <vtkPoints.h>
     6 #include <vtkCellArray.h>
     7 #include <vtkPolyData.h>
     8 #include <vtkPolyDataWriter.h>
     9 #include <vtkLine.h> //构建两个端点的连线
    10 int main()
    11 {
    12     //创建三个点坐标
    13     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    14     points->InsertNextPoint(1.0,0.0,0.0); // ID=0;
    15     points->InsertNextPoint(0.0,0.0,0.0); // ID=1;
    16     points->InsertNextPoint(0.0,1.0,0.0); // ID=2;
    17     //每两个点之间用直线连接
    18     //SetId(para1,para2);para1:出发端点的ID;para2:连接端点的ID
    19     vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
    20     line0->GetPointIds()->SetId(0,0);
    21     line0->GetPointIds()->SetId(1,1);
    22  
    23     vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
    24     line1->GetPointIds()->SetId(0,1);
    25     line1->GetPointIds()->SetId(1,2);
    26  
    27     vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
    28     line2->GetPointIds()->SetId(0,2);
    29     line2->GetPointIds()->SetId(1,0);
    30     //创建Cell,存储拓扑特征:线段
    31     vtkSmartPointer<vtkCellArray> LineCell = vtkSmartPointer<vtkCellArray>::New();
    32     LineCell->InsertNextCell(line0);
    33     LineCell->InsertNextCell(line1);
    34     LineCell->InsertNextCell(line2);
    35     
    36     //创建数据集,并转入拓扑结构和几何结构
    37     vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
    38     polydata->SetPoints(points);
    39     polydata->SetLines(LineCell);
    40  
    41     //写数据
    42     vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
    43     writer->SetFileName("DataStruct2D");
    44     writer->SetInputData(polydata);
    45     writer->Write();
    46  
    47     return 0;
    48 }

    利用Notepad++打开文件,利用ParaView可视化如下:

        

    4. 总结

    对于VTK的数据集而言,数据集的几何结构和拓扑结构是其必不可少的两个部分。实验一只定义了数据集的几何结构,没有定义该数据集的拓扑结构,所以该数据集不能直接显示;实验二和实验三除了定义数据集的几何结构(由points定义),还定义了相应的拓扑结构。其中实验二定义的是零维的点拓扑结构;实验三定义的是一维的线拓扑结构,它们都是保存在由类vtkCellArray所实例化的对象里,除了零维的点、一维的线等类型的单元以外,VTK还定义了其他类型的单元。
  • 相关阅读:
    Jenkins 插件管理
    持续集成 目录
    gitlab 目录
    jenkins 目录
    POJ 2828
    POJ 2782
    POJ 2725
    POJ 2769
    POJ 2739
    POJ 2707
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14241031.html
Copyright © 2011-2022 走看看