VTK拓扑结构的使用以及不同维度下的操作

发布时间:2024年01月19日

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引用关系的前提

1. 无拓扑结构

只有几何结构,没有拓扑结构的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;
}

2. 零维拓扑结构及实验

给数据集定义一维拓扑结构——顶点。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;
}

3. 一维拓扑结构及实验

在上例的基础上做一些更改,将零维的点拓扑结构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;
}

文章来源:https://blog.csdn.net/weixin_55035144/article/details/135688776
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。