VTK修炼之道12:基本数据结构_如何把几何结构拓扑结构加入到数据集
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道12:基本数据结构_如何把几何结构拓扑结构加入到数据集
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1. 無拓?fù)浣Y(jié)構(gòu)
只有幾何結(jié)構(gòu),沒有拓?fù)浣Y(jié)構(gòu)的vtkDataSet#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkPointData.h> #include <vtkPolyData.h> #include <vtkPolyDataWriter.h>int main() {//創(chuàng)建幾何數(shù)據(jù),沒有拓?fù)鋽?shù)據(jù)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);//把幾何數(shù)據(jù)(拓?fù)鋽?shù)據(jù)為空)放入到某個(gè)數(shù)據(jù)集中vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);//將polydata類型的數(shù)據(jù)寫到一個(gè)vtk文件中vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("PolyData.vtk");writer->SetInputData(polydata);writer->Write();return 0; }首先創(chuàng)建了一個(gè)點(diǎn)數(shù)據(jù)(vtkPoints),里面含有三個(gè)點(diǎn);緊接著創(chuàng)建了一個(gè)類型為vtkPolyData的數(shù)據(jù)集,vtkPolyData派生自類vtkPointSet,而vtkPointSet又派生自vtkDataSet,所以說vtkPolyData是一種具體的數(shù)據(jù)集;然后將創(chuàng)建的點(diǎn)數(shù)據(jù)加入到數(shù)據(jù)集,于是點(diǎn)數(shù)據(jù)就定義了該數(shù)據(jù)集的幾何;最后把vtkPolyData的數(shù)據(jù)用類vtkPolyDataWriter寫入到PolyData.vtk文件。 利用Notepad++打開文件,利用ParaView可視化如下:
? ??
2. 零維拓?fù)浣Y(jié)構(gòu)及實(shí)驗(yàn)
給數(shù)據(jù)集定義一維拓?fù)浣Y(jié)構(gòu)——頂點(diǎn)。#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h> #include <vtkPoints.h> //幾何結(jié)構(gòu) #include <vtkPolyData.h> //數(shù)據(jù)集 #include <vtkPolyDataWriter.h> #include <vtkCellArray.h> //拓?fù)浣Y(jié)構(gòu)int main() {//創(chuàng)建點(diǎn)坐標(biāo)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};//創(chuàng)建點(diǎn)數(shù)據(jù)&創(chuàng)建使每一個(gè)點(diǎn)加入類似頂點(diǎn)類型的CellvtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();for (unsigned int i=0; i<3; i++){//定義用來存儲點(diǎn)索引的中間變量,vtkIdType相當(dāng)int long等類型vtkIdType pId[1];//把點(diǎn)坐標(biāo)加入VTKPoints中,InserNextPoint()返回加入點(diǎn)的索引;//使用這個(gè)索引號創(chuàng)建定點(diǎn)類型CellpId[0] = points->InsertNextPoint(X[i],Y[i],Z[i]);//每個(gè)坐標(biāo)點(diǎn)都需要創(chuàng)建一個(gè)頂點(diǎn)Cellvertics->InsertNextCell(1,pId);}//創(chuàng)建VTKPolyData對象vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();//將幾何結(jié)構(gòu) & 拓?fù)浣Y(jié)構(gòu)加入到數(shù)據(jù)集中polydata->SetPoints(points);polydata->SetVerts(vertics);//寫數(shù)據(jù)、vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("TopoGeometry.vtk");writer->SetInputData(polydata);writer->Write();return 0; } 與實(shí)驗(yàn)一不同之處在于該程序?qū)嵗艘粋€(gè)vtkCellArray的對象,前文說“點(diǎn)數(shù)據(jù)(Point Data)定義數(shù)據(jù)集的幾何結(jié)構(gòu),單元數(shù)據(jù)(Cell Data)定義數(shù)據(jù)集的拓?fù)浣Y(jié)構(gòu)”。所以,vtkCellArray類型的對象vertices就是用來指定數(shù)據(jù)集polydata的拓?fù)浣Y(jié)構(gòu),而polydata的幾何結(jié)構(gòu)則是由points來定義的。
此處定義的數(shù)據(jù)集的拓?fù)浣Y(jié)構(gòu)是零維的點(diǎn),即單元類型是Vertex(頂點(diǎn))。
利用Notepad++打開文件,利用ParaView可視化如下:
? ?
3. 一維拓?fù)浣Y(jié)構(gòu)及實(shí)驗(yàn)
在上例的基礎(chǔ)上做一些更改,將零維的點(diǎn)拓?fù)浣Y(jié)構(gòu)改成一維的線拓?fù)浣Y(jié)構(gòu)。#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> //構(gòu)建兩個(gè)端點(diǎn)的連線 int main() {//創(chuàng)建三個(gè)點(diǎn)坐標(biāo)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;//每兩個(gè)點(diǎn)之間用直線連接//SetId(para1,para2);para1:出發(fā)端點(diǎn)的ID;para2:連接端點(diǎn)的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);//創(chuàng)建Cell,存儲拓?fù)涮卣?#xff1a;線段vtkSmartPointer<vtkCellArray> LineCell = vtkSmartPointer<vtkCellArray>::New();LineCell->InsertNextCell(line0);LineCell->InsertNextCell(line1);LineCell->InsertNextCell(line2);//創(chuàng)建數(shù)據(jù)集,并轉(zhuǎn)入拓?fù)浣Y(jié)構(gòu)和幾何結(jié)構(gòu)vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);polydata->SetLines(LineCell);//寫數(shù)據(jù)vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("DataStruct2D");writer->SetInputData(polydata);writer->Write();return 0; }利用Notepad++打開文件,利用ParaView可視化如下:
? ?
4. 總結(jié)
對于VTK的數(shù)據(jù)集而言,數(shù)據(jù)集的幾何結(jié)構(gòu)和拓?fù)浣Y(jié)構(gòu)是其必不可少的兩個(gè)部分。實(shí)驗(yàn)一只定義了數(shù)據(jù)集的幾何結(jié)構(gòu),沒有定義該數(shù)據(jù)集的拓?fù)浣Y(jié)構(gòu),所以該數(shù)據(jù)集不能直接顯示;實(shí)驗(yàn)二和實(shí)驗(yàn)三除了定義數(shù)據(jù)集的幾何結(jié)構(gòu)(由points定義),還定義了相應(yīng)的拓?fù)浣Y(jié)構(gòu)。其中實(shí)驗(yàn)二定義的是零維的點(diǎn)拓?fù)浣Y(jié)構(gòu);實(shí)驗(yàn)三定義的是一維的線拓?fù)浣Y(jié)構(gòu),它們都是保存在由類vtkCellArray所實(shí)例化的對象里,除了零維的點(diǎn)、一維的線等類型的單元以外,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圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道12:基本数据结构_如何把几何结构拓扑结构加入到数据集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女程序员 一直从事着软件研发的工作
- 下一篇: 最小二乘抛物线拟合原理及证明