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