vtkPolyData数据由几何结构数据、拓扑结构数据和属性数据组成。几何结构数据主要是组成模型的点集,拓扑结构数据是点按一定关系组成的单元数据,属性数据与几何结构数据和拓扑结构数据想关联,可以标量、向量、张量,可以用来间接表示图像的颜色。
VTK里用vtkCellArray来设置拓扑关系。
通过设置cell单元,调用InsertNextCell函数逐步添加新的cell,例如函数vtkCellArray::InsertNextCell ( vtkIdType??? npts,?? vtkIdType *??? pts )的第一个参数值标是cell中点的个数,第二个参数指向那些点的坐标数据。
(vtkIdType *pts,存储的是所包括点在points中的顺序信息,其个数当然应该和前面的npts一致。)
在这里,2点可以连成一条线,三点可以得到一个面。也就是说:vtk中关于点、线、面的那些信息都是存放在cellarray中,应用时也是直接对cellarray指针进行处理,数据的写入和读取在vtkCellArray类完成。
其主要成员变量为:
vtkCellArray *Verts; //点单元集
vtkCellArray *Lines; //线单元集
vtkCellArray *Polys; //多边形单元集
vtkCellArray *Strips; ???//三角带单元集
vtkCellTypes *Cells; ?????//关联上述各种单元集,它是获取Cell到Points引用关系的前提
vtkCellLinks *Links; ?//获取Point到Cells引用关系的前提
只有几何结构,没有拓扑结构的vtkDataSet。即没有用vtkCellArray来定义体数据中点、线、面数据之间的索引和联系。
没有用VTK默认的范式建立彼此之间显式、隐式地用数学公式连接起来的关系。
首先 创建了一个点数据(vtkPoints),里面含有三个点;
紧接着 创建了一个类型为vtkPolyData的数据集,vtkPolyData派生自类vtkPointSet,而vtkPointSet又派生自vtkDataSet,所以说vtkPolyData是一种具体的数据集;
然后将创建的点数据加入到数据集,于是点数据就定义了该数据集的几何;最后把vtkPolyData的数据用类vtkPolyDataWriter写入到PolyData.vtk文件:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>
int main()
{
//创建几何数据,没有拓扑数据
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(1.0,0.0,0.0);
points->InsertNextPoint(0.0,0.0,0.0);
points->InsertNextPoint(0.0,1.0,0.0);
//把几何数据(拓扑数据为空)放入到某个数据集中
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
//将polydata类型的数据写到一个vtk文件中
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
writer->SetFileName("PolyData.vtk");
writer->SetInputData(polydata);
writer->Write();
return 0;
}
给数据集定义一维拓扑结构——顶点。vtkCellArray中,零维<vtkCellArray> vertics表示一个只和自己点本身建立拓扑关系的顶点。这个顶点在此时此刻只与它自己有拓扑结构,不与其他的点线面体产生拓扑结构关系,因此为零维。
这里实例化了一个vtkCellArray的对象,前文说“点数据(Point Data)定义数据集的几何结构,单元数据(Cell Data)定义数据集的拓扑结构”。
所以,vtkCellArray类型的对象vertices就是用来指定数据集polydata的拓扑结构,而polydata的几何结构则是由points来定义的。
此处定义的数据集的拓扑结构是零维的点,即单元类型是Vertex(顶点)。
?? ??
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
#include <vtkSmartPointer.h>
#include <vtkPoints.h> //几何结构
#include <vtkPolyData.h> //数据集
#include <vtkPolyDataWriter.h>
#include <vtkCellArray.h> //拓扑结构
int main()
{
//创建点坐标
int X[3] = {1.0,0.0,0.0};
int Y[3] = {0.0,0.0,0.0};
int Z[3] = {0.0,1.0,0.0};
//创建点数据&创建使每一个点加入类似顶点类型的Cell
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();
for (unsigned int i=0; i<3; i++)
{
//定义用来存储点索引的中间变量,vtkIdType相当int long等类型
vtkIdType pId[1];
//把点坐标加入VTKPoints中,InserNextPoint()返回加入点的索引;
//使用这个索引号创建定点类型Cell
pId[0] = points->InsertNextPoint(X[i],Y[i],Z[i]);
//每个坐标点都需要创建一个顶点Cell
vertics->InsertNextCell(1,pId);
}
//创建VTKPolyData对象
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
//将几何结构 & 拓扑结构加入到数据集中
polydata->SetPoints(points);
polydata->SetVerts(vertics);
//写数据、
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
writer->SetFileName("TopoGeometry.vtk");
writer->SetInputData(polydata);
writer->Write();
return 0;
}
在上例的基础上做一些更改,将零维的点拓扑结构vertics改成一维的线拓扑结构<vtkCellArray> LineCell。这里将一维线段vtkLine与另一个线段vtkLine之间建立拓扑结构。这里将三个线段建立先后次序的拓扑结构关系。(线段是集合结构,线段之间的先后索引和联系是拓扑结构)
? ??
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataWriter.h>
#include <vtkLine.h> //构建两个端点的连线
int main()
{
//创建三个点坐标
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(1.0,0.0,0.0); // ID=0;
points->InsertNextPoint(0.0,0.0,0.0); // ID=1;
points->InsertNextPoint(0.0,1.0,0.0); // ID=2;
//每两个点之间用直线连接
//SetId(para1,para2);para1:出发端点的ID;para2:连接端点的ID
vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
line0->GetPointIds()->SetId(0,0);
line0->GetPointIds()->SetId(1,1);
vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
line1->GetPointIds()->SetId(0,1);
line1->GetPointIds()->SetId(1,2);
vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
line2->GetPointIds()->SetId(0,2);
line2->GetPointIds()->SetId(1,0);
//创建Cell,存储拓扑特征:线段
vtkSmartPointer<vtkCellArray> LineCell = vtkSmartPointer<vtkCellArray>::New();
LineCell->InsertNextCell(line0);
LineCell->InsertNextCell(line1);
LineCell->InsertNextCell(line2);
//创建数据集,并转入拓扑结构和几何结构
vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
polydata->SetPoints(points);
polydata->SetLines(LineCell);
//写数据
vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
writer->SetFileName("DataStruct2D");
writer->SetInputData(polydata);
writer->Write();
return 0;
}