左圖: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。
----------------------------------------------------------關於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設置頂點,諸如此類。