VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.VTKPolyData源數據總結
1之前的實例中,我們利用VTKConeSource源數據創建了一個棱錐。實際上VTK內部提供可以寫數據源類來快速獲取簡單的圖形數據。下面給出了最常見的幾種VTKPolyData數據源類:2.vtkPolyData數據的創建
前面多采用圖像或者VTK合成源數據進行討論。在這里,我們希望深入底層,顯示地定義一個點集合和一個單元集合。 點集合定義了VTKPolyData的幾何數據;單元集合定義了點的拓撲結構。每個單元由點的索引而非坐標來定義。這樣能夠減少數據的存儲空間。 單元的類型可以是點、三角形、矩形、多邊形等基本圖元(注意:只有定義了單元數據才能顯示該圖形數據)。這需要根據實際情況來定義相應的圖元。 下面的實例演示了一個簡單的VTKPolyData數據的創建過程: #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);//拓撲結構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); //設置拓撲結構//合成數據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用于存儲點集合。通過InserNextPoint()函數可以順序地為其添加點,并返回點的索引,索引從0開始。另外,還可以通過函數SetNumberofPoints()來指定其點的個數,然后調用SetPoint()函數為對應索引點設置坐標。代碼中含有5個坐標點。 利用定義的5個坐標點的索引定義一個VTKPolygon多邊形單元。vtkPolygon繼承自vtkCell類,表示一個多邊形單元。定義vtkPolygon單元時,需要指定組成改單元的點數(這里指定了四個點,所以定義的是四邊形)。vtkPolygon內部定義了一個vtkIdList對象,該對象存儲了點索引集合。通過調用vtkList類的SetNumberOfIds()函數可以設置點數,SetId則可以為指定的點設置索引,注意該索引必須是vtkPoints中的點索引。在該示例代碼中利用四個點構成了一個四邊形,利用三個點構成了一個三角形。 上例的顯示結果如下:
VTK中定義了大量的單元類,這些類都繼承自vtkCell,需要根據實際情況選擇使用。這里面,我只對單元類型為三角形和多邊形的圖形進行了分析,這通常也被稱為網格(Mesh)。在一個多邊形網格模型總,連接網格點的稱為邊,每個單元有一系列的邊順序連接而成,也被戲稱為面片。 vtkCellArray用于存儲所有的單元數據,InsertNextCell()函數一次插入定義的單元。只有點數據和單元數據都定義完畢才能通過下面的函數添加到vtkPolyData中: void SetPoints(vtkPoints*); void SetPolys(vtkCellArray*p);需要注意的是,SetPolys()接受的是多邊形單元數組,如果單元類型為頂點、線段或者三角形帶的話,則需要調用如下函數: 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圖形圖像開發進階[M]. 機械工業出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剖析三大个人IM工具安全隐患
- 下一篇: 飞鸽传书,又见飞鸽传书,