1.VTKPolyData源数据总结

1之前的实例中,我们利用VTKConeSource源数据创建了一个棱锥。实际上VTK内部提供可以写数据源类来快速获取简单的图形数据。下面给出了最常见的几种VTKPolyData数据源类:

2.vtkPolyData数据的创建

前面多采用图像或者VTK合成源数据进行讨论。在这里,我们希望深入底层,显示地定义一个点集合和一个单元集合。
点集合定义了VTKPolyData的几何数据;单元集合定义了点的拓扑结构。每个单元由点的索引而非坐标来定义。这样能够减少数据的存储空间。
单元的类型可以是点、三角形、矩形、多边形等基本图元(注意:只有定义了单元数据才能显示该图形数据)。这需要根据实际情况来定义相应的图元。
下面的实例演示了一个简单的VTKPolyData数据的创建过程:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkPolygon.h>
#include <vtkTriangle.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
///
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>int main()
{vtkSmartPointer<vtkPoints> pts =vtkSmartPointer<vtkPoints>::New();pts->InsertNextPoint(0.0, 0.0, 0.0);pts->InsertNextPoint(1.0, 0.0, 0.0);pts->InsertNextPoint(1.0, 1.0, 0.0);pts->InsertNextPoint(0.0, 1.0, 0.0);pts->InsertNextPoint(2.0, 0.0, 0.0);//拓扑结构vtkSmartPointer<vtkPolygon> polygon =vtkSmartPointer<vtkPolygon>::New();polygon->GetPointIds()->SetNumberOfIds(4);polygon->GetPointIds()->SetId(0, 0);polygon->GetPointIds()->SetId(1, 1);polygon->GetPointIds()->SetId(2, 2);polygon->GetPointIds()->SetId(3, 3);polygon->GetPointIds()->SetId(4, 4);vtkSmartPointer<vtkTriangle> triangle =vtkSmartPointer<vtkTriangle>::New();triangle->GetPointIds()->SetId(0, 1);triangle->GetPointIds()->SetId(1, 2);triangle->GetPointIds()->SetId(2, 4);vtkSmartPointer<vtkCellArray> cells =vtkSmartPointer<vtkCellArray>::New();cells->InsertNextCell(polygon);cells->InsertNextCell(triangle); //设置拓扑结构//合成数据vtkSmartPointer<vtkPolyData> polygonPolyData =vtkSmartPointer<vtkPolyData>::New();polygonPolyData->SetPoints(pts);polygonPolyData->SetPolys(cells);vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(polygonPolyData);vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkRenderer> render =vtkSmartPointer<vtkRenderer>::New();render->AddActor(actor);render->SetBackground(0.0, 0.0, 0.0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(render);rw->SetSize(320, 240);rw->SetWindowName("Creating PolyData Structure");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Render();rwi->Start();return 0;
}

vtkPoints用于存储点集合。通过InserNextPoint()函数可以顺序地为其添加点,并返回点的索引,索引从0开始。另外,还可以通过函数SetNumberofPoints()来指定其点的个数,然后调用SetPoint()函数为对应索引点设置坐标。代码中含有5个坐标点。

利用定义的5个坐标点的索引定义一个VTKPolygon多边形单元。vtkPolygon继承自vtkCell类,表示一个多边形单元。定义vtkPolygon单元时,需要指定组成改单元的点数(这里指定了四个点,所以定义的是四边形)。vtkPolygon内部定义了一个vtkIdList对象,该对象存储了点索引集合。通过调用vtkList类的SetNumberOfIds()函数可以设置点数,SetId则可以为指定的点设置索引,注意该索引必须是vtkPoints中的点索引。在该示例代码中利用四个点构成了一个四边形,利用三个点构成了一个三角形。
上例的显示结果如下:
VTK中定义了大量的单元类,这些类都继承自vtkCell,需要根据实际情况选择使用。这里面,我只对单元类型为三角形和多边形的图形进行了分析,这通常也被称为网格(Mesh)。在一个多边形网格模型总,连接网格点的称为边,每个单元有一系列的边顺序连接而成,也被戏称为面片。
vtkCellArray用于存储所有的单元数据,InsertNextCell()函数一次插入定义的单元。只有点数据和单元数据都定义完毕才能通过下面的函数添加到vtkPolyData中:
void SetPoints(vtkPoints*);
void SetPolys(vtkCellArray*p);

需要注意的是,SetPolys()接受的是多边形单元数组,如果单元类型为顶点、线段或者三角形带的话,则需要调用如下函数:

void SetVerts(vtkCellArray* v);
void SetLines(vtkCellArray* l);
void SetStrips(vtkCellArray* s);

3.参看资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道44:图形进阶_vtkPolyData数据源讨论与数据创建相关推荐

  1. VTK修炼之道48:图形基本操作进阶_符号化操作与模型区率计算

    1.符号化Glyphing再谈 上一篇帖子提到一个事,就是用符号化操作显示单元的法向量. 模型的法向量数据是向量数据,因此法向量不能像前面讲到的通过颜色映射来显示.但是可以通过符号化(Glyphing ...

  2. VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒

    1.基本图形操作意义 图形处理,比如图形平滑.多分辨率分析.特征提取等都离不开一些基本的图形操作.掌握这些基本的图形操作有助于理解和深入学习图形处理和分析方法. VTK中提供了多种图形的基本操作,其中 ...

  3. VTK修炼之道82:VTK管线机制_信息对象类VTKInformation

    1.VTK管线机制 VTK中通过管线机制来实现组合各种算法处理数据.每一种算法是一个Filter,多个Filter连接在一起形成VTK管线.每个Filter可以分为两个组成部分:一个是算法对象,继承自 ...

  4. VTK修炼之道11:基本数据结构_数据对象数据集

    1.前言 前面学习了VTK的一个重要概念--可视化管线,了解了VTK数据的流动过程.好比我们做一道菜,在做每一道菜之前,首先要掌握这道菜的做法,什么时候放盐什么时候放酱油等调料,除了需要弄清楚做每一道 ...

  5. VTK修炼之道10:可视化管道的连接与执行

    1.可视化管道综述 vtkProp;  vtkAbstractMapper; vtkProperty;  vtkCamera;  vtkLight;  vtkRenderer;  vtkRenderW ...

  6. VTK修炼之道45:图形进阶_vtkPolyData属性数据

    1.从图形着色说起 前一个实验显示结果中的图像是白色的,而图形颜色与vtkPolyData属性数据息息相关.由于并未指定任何颜色和属性数据,因此在显示时默认以白色显示. 属性数据包括点属性和单元属性. ...

  7. VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)

    1.表面重建 通过三维扫描仪所获取的实际物体的空间点云数据仅仅表示物体的几何形状,而无法表达其内部的拓扑结构.拓扑结构对于实际图形处理以及可视化具有更重要的意义.因此,这就需要利用表面重建技术奖点云数 ...

  8. VTK修炼之道59:图形基本操作进阶_纹理映射

    1.纹理映射 纹理映射是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程.纹理生成过程实质上是将所定义的纹理映射为某种三维物体表面的属性,并参与后续的光照计算.在三维图形中,纹理映射运用的十分广泛, ...

  9. VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)

    1.Iterative Closest Points算法 点云数据配准最经典的方法是迭代最近点算法(Iterative Closest Points,ICP).ICP算法是一个迭代的过程,每次迭代中对 ...

最新文章

  1. 2.0Tonmcat高级配置和jDK的安装配置
  2. 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv
  3. [云炬创业管理笔记]第一章讨论1
  4. react 调用 html5,React-Native Webview 和H5交互的两种方式
  5. react-native flatlist 上拉加载onEndReached方法频繁触发的问题
  6. nike附近门店查询_不止5折!200+入手Nike、adidas,比“11.11”还便宜!
  7. kvm vnc的使用,鼠标漂移等
  8. Apollo进阶课程㊷丨Apollo实战——车辆与循迹驾驶能力实战
  9. python入门神图
  10. 对话阿里云Alex Chen:下一代存储应如何面对云转型?
  11. eclipse 无法启动选择的项,最近未进行任何启动
  12. 数学建模——层次分析法,一致性检验学习笔记(一)
  13. Java知识点复习:Day14
  14. 狂肝两万字带你用pytorch搞深度学习!!!
  15. 正确方法将电子书放到Kindle的documents文件夹,还是看不了书?
  16. linux 硬盘满了如何处理
  17. Field accountDao in com.mdxl.service.AccountService required a bean of type 'com.mdxl.dao.MbAccountD
  18. sp许可证有什么用呢?
  19. mysql高效查出重复的手机号_Mysql必读MySQL大表中重复字段的高效率查询方法
  20. centos 安装flash插件

热门文章

  1. Quartz 2d绘图
  2. Android开发实践:利用ProGuard进行代码混淆
  3. linux下dhcp配置(一)
  4. hdu-Cube(三位树状数组)
  5. SOAR SQL进行优化和改写的自动化工具
  6. java的for循环的几种写法
  7. React Native开发环境搭建记录
  8. 对象创建方法,对象的内存分配,对象的访问定位
  9. AngularJS实战之Controller之间的通信
  10. hover与click样式冲突