3.3 各种数据集类型
在VTK中数据集的类型主要按构成数据集的几何数据和单元来划分,主要的数据集类型包括:结构化网格数据集、非结构化网格数据集、多边形数据集(vtkPolyData)、结构化点集(vtkStructuredPoints)、线性网格数据集、非结构化点集等几大类,各类的表现形式如下图所示:
(VTK 用户手册中给出的VTK数据类型图如下:)
3.3.1 多边形数据集
程序代码:
#include"vtkPolyData.h"
#include"vtkPoints.h"
#include"vtkCellArray.h"
#include"vtkFloatArray.h"
#include"vtkDoubleArray.h"
#include "vtkIntArray.h"
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkCamera.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkPolyDataMapper.h"
#include"vtkPointData.h"
int main()
{
int i;
//定义点在三维坐标系中的坐标
static float x[8][3]={{0,0,0,},{1,0,0},{1,1,0},{0,1,0},{0,0,1},{1,0,1},{1,1,1},{0,1,1}};
//定义单元(通过点的索引来表达点之间的关系,所以采用vtkIdType)
static vtkIdType pts[6][4]={{0,1,2,3},{4,5,6,7},{0,1,5,4},{1,2,6,5},{2,3,7,6},{3,0,4,7}};
vtkPolyData *cube=vtkPolyData::New();//创建数据集对象的实例
vtkPoints *points=vtkPoints ::New();//创建vtkPoints对象的实例
vtkCellArray *polys=vtkCellArray::New();
vtkFloatArray *scalars=vtkFloatArray::New();
for(i=0;i<8;i++)points->InsertPoint(i,x[i]);//将点坐标插入vtkPoints对象中
for(i=0;i<6;i++)polys->InsertNextCell(4,pts[i]);//
for(i=0;i<8;i++)scalars->InsertTuple1(1,1);
cube->SetPoints(points);//为数据集添加点,定义其几何
points->Delete();
cube->SetPolys(polys);//为数据集添加单元,定义其拓扑
polys->Delete();
cube->GetPointData()->SetScalars(scalars);
scalars->Delete();
vtkPolyDataMapper *cubeMapper=vtkPolyDataMapper::New();
cubeMapper->SetInput(cube);
cubeMapper->SetScalarRange(0,7);
vtkActor *cubeActor=vtkActor::New();
cubeActor->SetMapper(cubeMapper);
vtkCamera *cubeCamera=vtkCamera::New();
cubeCamera->SetPosition(1,1,1);
cubeCamera->SetFocalPoint(0,0,0);
vtkRenderer *renderer=vtkRenderer::New();
vtkRenderWindow *renWin=vtkRenderWindow::New();
renWin->AddRenderer(renderer);
vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
renderer->AddActor(cubeActor);
renderer->SetActiveCamera(cubeCamera);
renderer->ResetCamera();
renderer->SetBackground(1,1,1);
renWin->SetSize(300,300);
renWin->Render();
iren->Start();
return 0;
}
以上代码块可以分为如下几个部分:
1、实例化vtkPoints,创建立方体的点。
2、实例化vtkCellArray,创建立方体的单元。
3.3.2 结构化点数据集
结构化点数据集根据其表示的数据的维数分别由线单元(1D)、像素单元(2D)或体素单元(3D)组成。而且这些单元的大小形状都是一样的。所以数据集中的点是非常规则的排列在一起,并且排列的方向是与全局x-y-z坐标轴平行的。
正是由于结构上的规则,定义一个结构化点数据集时,不需要定义所有的点和所有的单元只需要知道一个起始点的坐标以及沿着三个坐标轴方向上相邻点的距离(该距离也就是单元的边的长度),就可以算出所有点的坐标。这两个参数通过SetOrigin()和SetSpacing()进行设置。对于单元,由于已知单元的类型只属于上面提到的三种中的一种,并且只有相邻的点才能构成单元,所以只要知道每个坐标轴方向上有多少个点(nx,ny,nz)就可以确定所有的单元了。该参数称为尺寸,用方法SetDimensions()进行设置。
也是由于结构上的规则,数据集中的点和单元可以用一个i-j-k自然坐标系来指定。数据集中共有nx*ny*nz个点,(nx-1)(ny-1),(nz-1)个单元。一个特定的点和单元可以用三个索引i-j-k指定。类似的,一条线可以用三个索引中的两个指定,一个面可以用一个索引指定。
例子代码:
#include"vtkActor.h"
#include"vtkRenderer.h"
#include"vtkRenderWindow.h"
#include"vtkPointData.h"
#include"vtkFloatArray.h"
#include"vtkPoints.h"
#include"vtkProperty.h"
#include"vtkPolyDataMapper.h"
#include"vtkRenderWindowInteractor.h"
#include"vtkStructuredPoints.h"
#include"vtkContourFilter.h"
int main()
{
int i,j,k,kOffset,jOffset,Offset;
float s,sp,x,y,z;
// 创建结构化点数据集,下面五行代码确定了数据集的拓扑与几何
vtkStructuredPoints *vol=vtkStructuredPoints::New();
vol->SetDimensions(26,26,26);
vol->SetOrigin(-0.5,-0.5,-0.5);
sp=1.0/25.0;
vol->SetSpacing(sp,sp,sp);
//创建标量属性
vtkFloatArray *scalars=vtkFloatArray::New();
scalars->SetNumberOfTuples(26*26*26);
for(k=0;k<26;k++)
{
z=-0.5+k*sp;
kOffset=k*26*26;
for(j=0;j<26;j++)
{
y=-0.5+j*sp;
jOffset=j*26;
for(i=0;i<26;i++)
{
x=-0.5+i*sp;
s=x*x+y*y+z*z-(0.4*0.4);
Offset=i+jOffset+kOffset;
scalars->InsertTuple1(Offset,s);
}
}
}
vol->GetPointData()->SetScalars(scalars);
scalars->Delete();
//抽取标量值为0的点所形成的面
vtkContourFilter *contour=vtkContourFilter::New ();
contour->SetInput(vol);
contour->SetValue(0,0);
vtkPolyDataMapper *volMapper=vtkPolyDataMapper::New();
volMapper->SetInputConnection(contour->GetOutputPort());
vtkActor *volActor=vtkActor::New();
volActor->SetMapper(volMapper);
volActor->GetProperty()->SetRepresentationToWireframe();
volActor->GetProperty()->SetColor(0,0,0);
vtkRenderer *renderer=vtkRenderer::New();
vtkRenderWindow *renwin=vtkRenderWindow::New();
renwin->AddRenderer(renderer);
vtkRenderWindowInteractor *iren=vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renwin);
renderer->AddActor(volActor);
renderer->SetBackground(1,1,1);
renderer->ResetCamera();
renwin->SetSize(300,300);
renwin->Render();
iren->Start();
return 0;
}
运行结果显示:
其他数据集略去,等有时间再看详细的创建方法。
http://image.szpt.edu.cn/UploadFiles/%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8E%E6%95%B0%E6%8D%AE%E5%B1%9E%E6%80%A7.swf
上面可以查看其他数据集的创建方法。
直接跳到3.4节。。。