VTK学习笔记--5 数据集和数据属性

3.3 各类数据集类型
app

在VTK中数据集的类型主要按构成数据集的几何数据和单元来划分,主要的数据集类型包括:结构化网格数据集、非结构化网格数据集、多边形数据集(vtkPolyData)、结构化点集(vtkStructuredPoints)、线性网格数据集、非结构化点集等几大类,各种的表现形式以下图所示:
spa

(VTK 用户手册中给出的VTK数据类型图以下:)scala

3.3.1 多边形数据集orm

程序代码:对象

#include"vtkPolyData.h"索引

#include"vtkPoints.h"ci

#include"vtkCellArray.h"get

#include"vtkFloatArray.h"it

#include"vtkDoubleArray.h"io

#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;

}

    

以上代码块能够分为以下几个部分:

一、实例化vtkPoints,建立立方体的点。

二、实例化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节。。。

相关文章
相关标签/搜索