VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.VTKPolyData源數(shù)據(jù)總結(jié)
1之前的實(shí)例中,我們利用VTKConeSource源數(shù)據(jù)創(chuàng)建了一個棱錐。實(shí)際上VTK內(nèi)部提供可以寫數(shù)據(jù)源類來快速獲取簡單的圖形數(shù)據(jù)。下面給出了最常見的幾種VTKPolyData數(shù)據(jù)源類:2.vtkPolyData數(shù)據(jù)的創(chuàng)建
前面多采用圖像或者VTK合成源數(shù)據(jù)進(jìn)行討論。在這里,我們希望深入底層,顯示地定義一個點(diǎn)集合和一個單元集合。 點(diǎn)集合定義了VTKPolyData的幾何數(shù)據(jù);單元集合定義了點(diǎn)的拓?fù)浣Y(jié)構(gòu)。每個單元由點(diǎn)的索引而非坐標(biāo)來定義。這樣能夠減少數(shù)據(jù)的存儲空間。 單元的類型可以是點(diǎn)、三角形、矩形、多邊形等基本圖元(注意:只有定義了單元數(shù)據(jù)才能顯示該圖形數(shù)據(jù))。這需要根據(jù)實(shí)際情況來定義相應(yīng)的圖元。 下面的實(shí)例演示了一個簡單的VTKPolyData數(shù)據(jù)的創(chuàng)建過程: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkPolygon.h> #include <vtkTriangle.h> #include <vtkCellArray.h> #include <vtkPolyData.h> /// #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkPoints> pts =vtkSmartPointer<vtkPoints>::New();pts->InsertNextPoint(0.0, 0.0, 0.0);pts->InsertNextPoint(1.0, 0.0, 0.0);pts->InsertNextPoint(1.0, 1.0, 0.0);pts->InsertNextPoint(0.0, 1.0, 0.0);pts->InsertNextPoint(2.0, 0.0, 0.0);//拓?fù)浣Y(jié)構(gòu)vtkSmartPointer<vtkPolygon> polygon =vtkSmartPointer<vtkPolygon>::New();polygon->GetPointIds()->SetNumberOfIds(4);polygon->GetPointIds()->SetId(0, 0);polygon->GetPointIds()->SetId(1, 1);polygon->GetPointIds()->SetId(2, 2);polygon->GetPointIds()->SetId(3, 3);polygon->GetPointIds()->SetId(4, 4);vtkSmartPointer<vtkTriangle> triangle =vtkSmartPointer<vtkTriangle>::New();triangle->GetPointIds()->SetId(0, 1);triangle->GetPointIds()->SetId(1, 2);triangle->GetPointIds()->SetId(2, 4);vtkSmartPointer<vtkCellArray> cells =vtkSmartPointer<vtkCellArray>::New();cells->InsertNextCell(polygon);cells->InsertNextCell(triangle); //設(shè)置拓?fù)浣Y(jié)構(gòu)//合成數(shù)據(jù)vtkSmartPointer<vtkPolyData> polygonPolyData =vtkSmartPointer<vtkPolyData>::New();polygonPolyData->SetPoints(pts);polygonPolyData->SetPolys(cells);vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(polygonPolyData);vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> render =vtkSmartPointer<vtkRenderer>::New();render->AddActor(actor);render->SetBackground(0.0, 0.0, 0.0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(render);rw->SetSize(320, 240);rw->SetWindowName("Creating PolyData Structure");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Render();rwi->Start();return 0; }vtkPoints用于存儲點(diǎn)集合。通過InserNextPoint()函數(shù)可以順序地為其添加點(diǎn),并返回點(diǎn)的索引,索引從0開始。另外,還可以通過函數(shù)SetNumberofPoints()來指定其點(diǎn)的個數(shù),然后調(diào)用SetPoint()函數(shù)為對應(yīng)索引點(diǎn)設(shè)置坐標(biāo)。代碼中含有5個坐標(biāo)點(diǎn)。 利用定義的5個坐標(biāo)點(diǎn)的索引定義一個VTKPolygon多邊形單元。vtkPolygon繼承自vtkCell類,表示一個多邊形單元。定義vtkPolygon單元時,需要指定組成改單元的點(diǎn)數(shù)(這里指定了四個點(diǎn),所以定義的是四邊形)。vtkPolygon內(nèi)部定義了一個vtkIdList對象,該對象存儲了點(diǎn)索引集合。通過調(diào)用vtkList類的SetNumberOfIds()函數(shù)可以設(shè)置點(diǎn)數(shù),SetId則可以為指定的點(diǎn)設(shè)置索引,注意該索引必須是vtkPoints中的點(diǎn)索引。在該示例代碼中利用四個點(diǎn)構(gòu)成了一個四邊形,利用三個點(diǎn)構(gòu)成了一個三角形。 上例的顯示結(jié)果如下:
VTK中定義了大量的單元類,這些類都繼承自vtkCell,需要根據(jù)實(shí)際情況選擇使用。這里面,我只對單元類型為三角形和多邊形的圖形進(jìn)行了分析,這通常也被稱為網(wǎng)格(Mesh)。在一個多邊形網(wǎng)格模型總,連接網(wǎng)格點(diǎn)的稱為邊,每個單元有一系列的邊順序連接而成,也被戲稱為面片。 vtkCellArray用于存儲所有的單元數(shù)據(jù),InsertNextCell()函數(shù)一次插入定義的單元。只有點(diǎn)數(shù)據(jù)和單元數(shù)據(jù)都定義完畢才能通過下面的函數(shù)添加到vtkPolyData中: void SetPoints(vtkPoints*); void SetPolys(vtkCellArray*p);需要注意的是,SetPolys()接受的是多邊形單元數(shù)組,如果單元類型為頂點(diǎn)、線段或者三角形帶的話,則需要調(diào)用如下函數(shù): void SetVerts(vtkCellArray* v); void SetLines(vtkCellArray* l); void SetStrips(vtkCellArray* s);
3.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剖析三大个人IM工具安全隐患
- 下一篇: 飞鸽传书,又见飞鸽传书,