左图: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设置顶点,诸如此类。