VTK:幾何結構,拓撲結構,cell,cellarray,polydata之間的關系筆記


     左圖:VTK默認坐標方向。

 

 

對於圖一,以下是demo代碼:

 1     //幾何數據
 2     float pts[][3]={{0,0,0},{1,1,0}};
 3     vtkSmartPointer<vtkPoints> Pointes=vtkSmartPointer<vtkPoints>::New();
 4     Pointes->SetNumberOfPoints(2);
 5     Pointes->InsertPoint(0,pts[0]);
 6     Pointes->InsertPoint(1,pts[1]);
 7     //屬性數據
 8     vtkSmartPointer<vtkFloatArray> lineScalars=vtkSmartPointer<vtkFloatArray>::New();
 9     lineScalars->SetNumberOfTuples(2);
10     lineScalars->InsertValue(0,0);
11     lineScalars->InsertValue(1,1);
12     //拓撲結構
13     vtkSmartPointer<vtkLine> aLine=vtkSmartPointer<vtkLine>::New();
14     aLine->GetPointIds()->SetNumberOfIds(2);
15     aLine->GetPointIds()->SetId(0,0);
16     aLine->GetPointIds()->SetId(1,1);
17     //創建單元數組
18     vtkSmartPointer<vtkCellArray> lineCells=vtkSmartPointer<vtkCellArray>::New();
19     lineCells->InsertNextCell(aLine);
20     //將以上數據組合成一個vtkPolyData
21     vtkSmartPointer<vtkPolyData> polydata=vtkSmartPointer<vtkPolyData>::New();
22     polydata->SetPoints(Pointes);
23     polydata->SetLines(lineCells);
24     polydata->GetPointData()->SetScalars(lineScalars);
25     
26     //后面是mapper,actor,renderer,window,windowInteractor,略

還有一段用於理解vtkPolyData和vtkCellArray的代碼:

 1   int i;
 2   static float x[8][3]={{0,0,0}, {1,0,0}, {1,1,0}, {0,1,0},
 3                         {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1}};
 4   static vtkIdType pts[6][4]={{0,1,2,3}, {4,5,6,7}, {0,1,5,4},
 5                         {1,2,6,5}, {2,3,7,6}, {3,0,4,7}};
 6   
 7   // We'll create the building blocks of polydata including data attributes.
 8   vtkPolyData *cube = vtkPolyData::New();
 9   vtkPoints *points = vtkPoints::New();
10   vtkCellArray *polys = vtkCellArray::New();
11   vtkFloatArray *scalars = vtkFloatArray::New();
12  
13   // Load the point, cell, and data attributes.
14   for (i=0; i<8; i++) points->InsertPoint(i,x[i]);//將點保存在vtkPoints中
15   for (i=0; i<6; i++) polys->InsertNextCell(4,pts[i]);//6個面,每個面由4個點組成,對應pts[i]的4個ID
16   for (i=0; i<8; i++) scalars->InsertTuple1(i,i);//這個應該是為每個點賦顏色用的,對應 cubeMapper->SetScalarRange(0,7);
17  
18   // We now assign the pieces to the vtkPolyData.
19   cube->SetPoints(points);
20   points->Delete();
21   cube->SetPolys(polys);
22   polys->Delete();
23   cube->GetPointData()->SetScalars(scalars);
24   scalars->Delete();

--------------------------------------------------------------理解VTK中point(點)、cell(單元)、和dataset(數據集)的關系---------------------------------------------------------------------------------------------------------------

1、從Point到Cells的關系由vtkCellLinks 完成:

vtkCellLinks 表示a list of Links,每個Link包含一個單元Id的列表,列表中的各單元同時在使用同一個點。

class Link {
public:
unsigned short ncells;  //列表中單元個數
vtkIdType *cells;      //指向單元id的指針
};

vtkCellLinks ::BuildLinks(vtkDataSet *data)//該函數的功能就是建立上述從Point到Cells的列表

2、從Cell到Points的關系由vtkCell完成,它包括單元所使用的點的信息:

// left public for quick computational access
vtkPoints *Points;  //構成單元的Points的坐標信息
vtkIdList *PointIds;  //對應Points的Id信息

 3、同類單元(vtkCell可以組成一個單元數組(vtkCellArray)

其結構可理解為:(n,id1,id2,...,idnn,id1,id2,...,idn, ...),n表示一個單元包含的點的個數,id?表示單元所關聯的點的Id。

4、不同類型的多個vtkCellArray被添加到vtkCellTypes后就可以構成比較復雜的數據集,如vtkPolyData

它包括主要成員變量:

vtkCellArray *Verts;  //點單元集
vtkCellArray *Lines;  //線單元集
vtkCellArray *Polys;  //多邊形單元集
vtkCellArray *Strips;    //三角帶單元集  

// supporting structures for more complex topological operations
// built only when necessary
vtkCellTypes *Cells;      //關聯上述各種單元集,它是獲取Cell到Points引用關系的前提
vtkCellLinks *Links;    //獲取Point到Cells引用關系的前提

 

因此,如果要處理點和單元的引用關系,需要先初始化Cells和Links這兩個變量,即分別調用BuildLinks和調用

BuildCells,與此相反去掉關聯的函數分別為DeleteLinks和DeleteCells。

----------------------------------------------------------關於VTK中point的插入和cell的插入----------------------------------------------------------------------------

vtkPoints:SetPoint( vtkIdType id, double x[3] )和InsertPoint( vtkIdType id, double x[3] )可以設置點的vtkIdType(類似ID值)和三維坐標。

  兩個函數的區別在於:InsertPoint先要完成點的范圍檢查和內存分配工作,索引速度較慢。

  注:這兩個函數的實質是調用SetTuple( const vtkIdType i, const float *tuple )和InsertTuple( const vtkIdType i, const float *tuple )在數組的第i個位置賦值。

vtkCellArray中設置cell單元,調用InsertNextCell函數逐步添加新的cell。

例如函數vtkCellArray::InsertNextCell ( vtkIdType npts, vtkIdType * pts )的第一個參數值標是cell中點的個數,第二個參數指向那些點的坐標數據。

  說明:vtkIdType *pts,存儲的是所包括點在points中的順序信息,其個數當然應該和前面的npts一致。這里,2點可以連成一條線,三點可以得到一個面。

  也就是說:vtk中關於點、線、面的那些信息都是存放在cellarray中,應用時也是直接對cellarray指針進行處理,數據的寫入和讀取在vtkCellArray類完成。

  接下來的工作是定義一個vtkPolyData,得到包括頂點、線、多邊形、三角形帶在內的幾何結構,即三維實體。

  這里通過函數SetPoints設置點信息,SetPolys設置單元排列(cell array)定義多邊形,cell array設置單元排列(cell array)定義線,SetStrips設置單元排列(cell array)定義三角形帶strip,SetVerts設置頂點,諸如此類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM