文档章节

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

小王爷_2019
 小王爷_2019
发布于 2015/01/15 17:11
字数 1158
阅读 382
收藏 0

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节。。。






© 著作权归作者所有

上一篇: VTK 学习笔记
下一篇: .NET 相关
小王爷_2019
粉丝 19
博文 32
码字总数 35677
作品 0
海淀
程序员
私信 提问
Activiz 使用笔记-4 数据源(2)

上一篇写了一些数据源的生成或者读取方法。下面开始严肃的讲一下VTK中的数据集,虽然感觉有时候不会直接去用,但是感觉这个是基础,所以要先看。 直接看《VTK用户手册》的第44页 3.1 可视化v...

小王爷和老王爷
2015/11/24
417
0
Activiz 使用笔记 (6) 图像数据及其处理

http://image.szpt.edu.cn/UploadFiles/%E5%9B%BE%E5%83%8F%E6%95%B0%E6%8D%AE%E5%8F%8A%E5%85%B6%E5%A4%84%E7%90%86.swf 图像数据集用类vtkImageData表示。其结构与结构化点数据集是一样的,......

小王爷和老王爷
2015/11/26
524
0
Activiz 使用笔记-3 数据源(1)

activiz本身自带的user guide 比较简单,所以我按着vtk的user guide来慢慢学。从简单例子入手去学习VTK。当然我之前已经看过很多VTK相关的东西了,但是没有自己去写去总结,导致我一段时间不...

小王爷和老王爷
2015/09/07
949
0
VTK5.6安装配置教程

1. 必须下载: vtk-5.6.0-win32.exe vtk-5.6.0.zip 源程序 vtkdata-5.6.0.zip 数据 (vtk相关安装程序下载:http://vtk.org) cmake-2.8.2-win32-x86.zip (cmake程序下载:http://www.cmak......

teacheryang
2010/10/12
0
0
《数据库设计那些事》学习笔记

网址:http://www.imooc.com/learn/117 学习吧观点:数据库设计的经验比知识重要,物理设计必须文档化 第1章 需求分析 1-1 数据库设计简介 优良的设计:减少数据冗余,避免数据维护异常,节约...

学习吧
2015/10/17
164
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部