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数据集中,几何结构和拓扑结构是非常重要的两个部分,几何结构决定了其空间位置,拓扑结构决定其连接关系及顺序。
来源:CSDN
作者:蒲公英24
链接:https://blog.csdn.net/qq_31622605/article/details/81172151