1. 程式人生 > 其它 >VTK:幾何結構,拓撲結構,cell,cellarray,polydata之間的關係筆記

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,...,idn,n,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。