VTK修炼之道12:基本数据结构_如何把几何结构拓扑结构加入到数据集
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道12:基本数据结构_如何把几何结构拓扑结构加入到数据集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 無拓撲結構
只有幾何結構,沒有拓撲結構的vtkDataSet#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkPointData.h> #include <vtkPolyData.h> #include <vtkPolyDataWriter.h>int main() {//創建幾何數據,沒有拓撲數據vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();points->InsertNextPoint(1.0,0.0,0.0);points->InsertNextPoint(0.0,0.0,0.0);points->InsertNextPoint(0.0,1.0,0.0);//把幾何數據(拓撲數據為空)放入到某個數據集中vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);//將polydata類型的數據寫到一個vtk文件中vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("PolyData.vtk");writer->SetInputData(polydata);writer->Write();return 0; }首先創建了一個點數據(vtkPoints),里面含有三個點;緊接著創建了一個類型為vtkPolyData的數據集,vtkPolyData派生自類vtkPointSet,而vtkPointSet又派生自vtkDataSet,所以說vtkPolyData是一種具體的數據集;然后將創建的點數據加入到數據集,于是點數據就定義了該數據集的幾何;最后把vtkPolyData的數據用類vtkPolyDataWriter寫入到PolyData.vtk文件。 利用Notepad++打開文件,利用ParaView可視化如下:
? ??
2. 零維拓撲結構及實驗
給數據集定義一維拓撲結構——頂點。#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkPoints.h> //幾何結構 #include <vtkPolyData.h> //數據集 #include <vtkPolyDataWriter.h> #include <vtkCellArray.h> //拓撲結構int main() {//創建點坐標int X[3] = {1.0,0.0,0.0};int Y[3] = {0.0,0.0,0.0};int Z[3] = {0.0,1.0,0.0};//創建點數據&創建使每一個點加入類似頂點類型的CellvtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();for (unsigned int i=0; i<3; i++){//定義用來存儲點索引的中間變量,vtkIdType相當int long等類型vtkIdType pId[1];//把點坐標加入VTKPoints中,InserNextPoint()返回加入點的索引;//使用這個索引號創建定點類型CellpId[0] = points->InsertNextPoint(X[i],Y[i],Z[i]);//每個坐標點都需要創建一個頂點Cellvertics->InsertNextCell(1,pId);}//創建VTKPolyData對象vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();//將幾何結構 & 拓撲結構加入到數據集中polydata->SetPoints(points);polydata->SetVerts(vertics);//寫數據、vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("TopoGeometry.vtk");writer->SetInputData(polydata);writer->Write();return 0; } 與實驗一不同之處在于該程序實例化了一個vtkCellArray的對象,前文說“點數據(Point Data)定義數據集的幾何結構,單元數據(Cell Data)定義數據集的拓撲結構”。所以,vtkCellArray類型的對象vertices就是用來指定數據集polydata的拓撲結構,而polydata的幾何結構則是由points來定義的。
此處定義的數據集的拓撲結構是零維的點,即單元類型是Vertex(頂點)。
利用Notepad++打開文件,利用ParaView可視化如下:
? ?
3. 一維拓撲結構及實驗
在上例的基礎上做一些更改,將零維的點拓撲結構改成一維的線拓撲結構。#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkCellArray.h> #include <vtkPolyData.h> #include <vtkPolyDataWriter.h> #include <vtkLine.h> //構建兩個端點的連線 int main() {//創建三個點坐標vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();points->InsertNextPoint(1.0,0.0,0.0); // ID=0;points->InsertNextPoint(0.0,0.0,0.0); // ID=1;points->InsertNextPoint(0.0,1.0,0.0); // ID=2;//每兩個點之間用直線連接//SetId(para1,para2);para1:出發端點的ID;para2:連接端點的IDvtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();line0->GetPointIds()->SetId(0,0);line0->GetPointIds()->SetId(1,1);vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();line1->GetPointIds()->SetId(0,1);line1->GetPointIds()->SetId(1,2);vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();line2->GetPointIds()->SetId(0,2);line2->GetPointIds()->SetId(1,0);//創建Cell,存儲拓撲特征:線段vtkSmartPointer<vtkCellArray> LineCell = vtkSmartPointer<vtkCellArray>::New();LineCell->InsertNextCell(line0);LineCell->InsertNextCell(line1);LineCell->InsertNextCell(line2);//創建數據集,并轉入拓撲結構和幾何結構vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);polydata->SetLines(LineCell);//寫數據vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("DataStruct2D");writer->SetInputData(polydata);writer->Write();return 0; }利用Notepad++打開文件,利用ParaView可視化如下:
? ?
4. 總結
對于VTK的數據集而言,數據集的幾何結構和拓撲結構是其必不可少的兩個部分。實驗一只定義了數據集的幾何結構,沒有定義該數據集的拓撲結構,所以該數據集不能直接顯示;實驗二和實驗三除了定義數據集的幾何結構(由points定義),還定義了相應的拓撲結構。其中實驗二定義的是零維的點拓撲結構;實驗三定義的是一維的線拓撲結構,它們都是保存在由類vtkCellArray所實例化的對象里,除了零維的點、一維的線等類型的單元以外,VTK還定義了其他類型的單元。5. 參考資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道12:基本数据结构_如何把几何结构拓扑结构加入到数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女程序员 一直从事着软件研发的工作
- 下一篇: 即时通讯系统的应用