VTK008_vtk-数据结构及转换

戏子无情 提交于 2020-03-06 00:01:45

VTK数据结构:

vtk可视化管线和渲染引擎是vtk最重要的两部分,具体而言,前者是用于读取数据处理数据,后者则是渲染数据,显示模型,在这之间,离不开vtk的数据结构。可以认为数据结构是连接vtk可视化管线和vtk渲染引擎的桥梁

vtk数据都是vtkDataObject的子类,通常,我们不会直接使用vtkDataObject来实例化一个vtk数据,一般都是通过指定的数据读取类直接读取文件的数据,再通过接口获取读取到的数据,或者通过vtkDataObject的一些常用子类来实例化数据对象。

vtkDataObject:

vtkDataObject有非常多的子类,数据类型也有差别,比较常用的vtk数据结构有:vtkPolyData,vtkImageData等。

vtkDataSet:

vtkDataSet分为两个部分:拓扑结构,几何结构拓扑结构是用于描述物体的构成形式,几何结构是用于描述物体的空间位置关系拿vtkPointSet举例:通俗的说,所有的点组成了几何结构,所有的点的连接关系组成了拓扑结构

数据集:

vtkPolyData,我们使用最多的数据结构,实际上就是只有几何结构,没有拓扑结构的数据集,但是,通常来说,是需要拓扑结构的。如下,添加了vtkCellArray,即指定了顺序,如果去掉pPolyData->SetVerts(pCellArray);,也就变成了没有拓扑结构的数据了。

#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyDataWriter.h>

#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>


int main(int argc, char*argv[])
{
	double p1[3] = { 0, 1, 0 };
	double p2[3] = { 0, 0, 0 };
	double p3[3] = { 1, 0, 0 };

	vtkSmartPointer<vtkPoints> pPoints = vtkPoints::New();
	vtkSmartPointer<vtkCellArray> pCellArray = vtkCellArray::New();

	vtkIdType pID = 0;

	pID = pPoints->InsertNextPoint(p1);		// 相当于OpenGL中的顶点数组对象
	pCellArray->InsertNextCell(1, &pID);	// 相当于OpenGL中的顶点索引对象,1代表第一个网格
	pID = pPoints->InsertNextPoint(p2);
	pCellArray->InsertNextCell(1, &pID);
	pID = pPoints->InsertNextPoint(p3);
	pCellArray->InsertNextCell(1, &pID);

	vtkSmartPointer<vtkPolyData> pPolyData = vtkPolyData::New();
	pPolyData->SetPoints(pPoints);
	pPolyData->SetVerts(pCellArray);
	//------写入文件
	vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
	writer->SetFileName("PolyData.vtk");
	writer->SetInputData(pPolyData);
	writer->Write();

	//------
	vtkSmartPointer<vtkPolyDataMapper> pMap = vtkPolyDataMapper::New();
	pMap->SetInputData(pPolyData);

	vtkSmartPointer<vtkActor> pActor = vtkActor::New();
	pActor->SetMapper(pMap);
	pActor->GetProperty()->SetColor(1.0, 1.0, 0.0);

	vtkSmartPointer<vtkRenderer> pRender = vtkRenderer::New();
	pRender->AddActor(pActor);

	vtkSmartPointer<vtkRenderWindow> pRenWin = vtkRenderWindow::New();
	pRenWin->AddRenderer(pRender);

	pRenWin->SetSize(800, 450);
	pRenWin->Render();

	vtkSmartPointer<vtkInteractorStyleTrackballCamera> pStyle = vtkInteractorStyleTrackballCamera::New();
	vtkSmartPointer<vtkRenderWindowInteractor> pIren = vtkRenderWindowInteractor::New();
	pIren->SetInteractorStyle(pStyle);
	pIren->SetRenderWindow(pRenWin);

	pIren->Start();
	
	return 0;
}

上面的代码是绘制三个点,从中,我们可以看出vtkPolyData的数据结构:

同样的,如果我们使用vtkLine也可以创建数据集:

int main(int argc, char* argv[])
{
	double p1[3] = { 0, 1, 0 };
	double p2[3] = { 0, 0, 0 };
	double p3[3] = { 1, 0, 0 };

	vtkSmartPointer<vtkLine> pLine0 = vtkLine::New();
	vtkSmartPointer<vtkLine> pLine1 = vtkLine::New();
	vtkSmartPointer<vtkLine> pLine2 = vtkLine::New();
	vtkSmartPointer<vtkCellArray> pCellArray = vtkCellArray::New();

	vtkIdType pID = 0;
	vtkSmartPointer<vtkPoints> pPoints = vtkSmartPointer<vtkPoints>::New();
	pPoints->InsertNextPoint(1.0, 0.0, 0.0); // ID=0;
	pPoints->InsertNextPoint(0.0, 0.0, 0.0); // ID=1;
	pPoints->InsertNextPoint(0.0, 1.0, 0.0); // ID=2;

	pLine0->GetPointIds()->SetId(0, 0);
	pLine0->GetPointIds()->SetId(1, 1);

	pLine1->GetPointIds()->SetId(0, 1);
	pLine1->GetPointIds()->SetId(1, 2);

	pLine2->GetPointIds()->SetId(0, 2);
	pLine2->GetPointIds()->SetId(1, 0);

	pCellArray->InsertNextCell(pLine0);
	pCellArray->InsertNextCell(pLine1);
	pCellArray->InsertNextCell(pLine2);

	vtkSmartPointer<vtkPolyData> pPolyData = vtkPolyData::New();
	pPolyData->SetPoints(pPoints);
	pPolyData->SetLines(pCellArray);
	//------写入文件
	vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
	writer->SetFileName("PolyData.vtk");
	writer->SetInputData(pPolyData);
	writer->Write();

	//------
	vtkSmartPointer<vtkPolyDataMapper> pMap = vtkPolyDataMapper::New();
	pMap->SetInputData(pPolyData);

	vtkSmartPointer<vtkActor> pActor = vtkActor::New();
	pActor->SetMapper(pMap);
	pActor->GetProperty()->SetColor(1.0, 1.0, 0.0);

	vtkSmartPointer<vtkRenderer> pRender = vtkRenderer::New();
	pRender->AddActor(pActor);

	vtkSmartPointer<vtkRenderWindow> pRenWin = vtkRenderWindow::New();
	pRenWin->AddRenderer(pRender);

	pRenWin->SetSize(800, 450);
	pRenWin->Render();

	vtkSmartPointer<vtkInteractorStyleTrackballCamera> pStyle = vtkInteractorStyleTrackballCamera::New();
	vtkSmartPointer<vtkRenderWindowInteractor> pIren = vtkRenderWindowInteractor::New();
	pIren->SetInteractorStyle(pStyle);
	pIren->SetRenderWindow(pRenWin);

	pIren->Start();

	return 0;
}

其效果如下:

总结:

在vtk数据集中,几何结构和拓扑结构是非常重要的两个部分,几何结构决定了其空间位置,拓扑结构决定其连接关系及顺序。

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!