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。