VTK学习笔记(十九)vtk polydata

  • 1、VtkPolyData的镜像操作
  • 2、vtkPolyData数据组成及属性修改
  • 3、VTK图像处理(二)--vtkPolyData数据处理
    • 前言
    • vtkPolyData数据生成与显示
    • VTK常见的vtkPolyData数据源类
    • vtkPolyData数据的创建
    • vtkPolyData属性数据
    • 基本图形操作
    • 法向量计算
    • 符号化Glyphing
    • 曲率计算
    • 网格平滑
    • 封闭性检测与填补漏洞
    • 连通区域分析

以下内容都来自网络搜集

1、VtkPolyData的镜像操作

以下代码完成了vtkPolyData沿x轴的镜像变换

void MirrorPolydata(vtkSmartPointer<vtkPolyData> &polyData)
{int nAxis = 0;double bounds[6];polyData->GetBounds(bounds);double adjust[3] = {0, 0, 0};adjust[nAxis] = (bounds[nAxis * 2] + bounds[nAxis * 2 + 1]);double dir[3] = {1, 1, 1};dir[nAxis] = -1;vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();int nPointsNum = polyData->GetNumberOfPoints();for (int i = 0; i < nPointsNum; ++i){double point[3];polyData->GetPoint(i, point);points->InsertNextPoint(point[0] * dir[0] + adjust[0],point[1] * dir[1] + adjust[1],point[2] * dir[2] + adjust[2]);}polyData->SetPoints(points);polyData->GetPointData()->SetNormals(NULL);
}

效果如下:

镜像前

镜像后

参考:VtkPolyData的镜像操作

2、vtkPolyData数据组成及属性修改

一、数据组成

几何结构数据、拓扑结构数据和属性数据

1.几何结构数据:组成模型的点集;

2.拓扑结构数据:这些点根据一定的连接关系(如线性、三角形等)组成单元数据;表明集合点集之间的拓扑关系;

3.属性数据:与几何结构数据和拓扑结构数据相关联,属性数据可以是标量、向量或者张量。

如,可以为其中的每个点定义曲率属性数据,也可以为其中的每个单元定义一个法向量数据。在vtkPolyData可视化中会利用这些属性数据直接或者间接计算单元或点的颜色。

数据显示流程sourceData->polyData->Mapper->Actor->Render->RenderWindow->RenderWindowInteractor

参考:【VTK】vtkPolyData数据组成及属性修改

3、VTK图像处理(二)–vtkPolyData数据处理

前言

vtkPolyData数据是一种广泛使用的vtk数据结构,可以用来表示很多常用的数据结构,如点云数据、面片模型等。本文章先分析vtkPolyData数据的基本组成,创建方法和显示管线,结果介绍了一些基本操作,如距离、面积、包围盒、法向量以及符号化等。这些都是高级图像图像处理,此外还着中分析了图形平滑、封闭性检测、连通性分析、多分辨率处理、表面重建、点云配准、纹理映射等内容。掌握这些内容便可以解决许多实际性的工程问题。
详细内容参见《VTK 图形图像开发进阶》第六章。该书得下载地址如下:
链接:https://pan.baidu.com/s/1hG9js6eZkTqL6Fh-b_C-Dg
提取码:cod8

vtkPolyData数据生成与显示

  • vtkPolyData数据由几何结构数据、拓扑结构数据和属性数据组成。几何结构数据主要是组成模型的点集,拓扑结构数据是点按一定关系组成的单元数据,属性数据与几何结构数据和拓扑结构数据想关联,可以标量、向量、张量,可以用来间接表示图像的颜色。
  • GetNumberOfPoints()GetNumberOfCells()可以分别获取图形的点数和单元数目;
  • vtkPolyData数据显示时需要定义vtkPolyDataMapper对象,用来接受vtkPolyData数据以实现图形数据到渲染图元的转换。

VTK常见的vtkPolyData数据源类

vtkPolyData数据的创建

  • 需要先定义一个点集和一个单元集合,单元的类型可以是点、三角形、矩形、多边形等基本图形。只有定义了单元数据才能显示该图形数据。
  • 具体创建代码见6.1.2节。

vtkPolyData属性数据

  • 图形的颜色与vtkPolyData属性数据息息相关,可为点数据和单元数据分别指定属性数据。
  • 点和单元属性数据分别存储咋vtkPointData和vtkCellData中,可以通过调用GetCellData()函数获取一个vtkCellData类型单元数据指针,在通过SetScalars()函数设置颜色数据。
  • 由于可以同时设置点和单元设置属性,那么怎么用点和单元来控制颜色呢?这就需要使用vtkPolyDataMapper类的方法。
    • SetScalarModeToDefault(),默认设置,该设置下首先使用点的标量数据控制颜色,若点标量数据不可用时,则使用单元数据。
    • SetScalarModeToUsePointData(),使用点的标量数据控制颜色,若点标量数据不可用也不会使用其他数据。
    • SetScalarModeToUseCellData(),使用单元的标量数据控制颜色,若单元标量数据不可用也不会使用其他数据。
    • SetScalarModeToUsePointFieldData()/SetScalarModeToUseCellFieldData(),点数据和标量数据都不会用来着色,而是使用属性数据中场数据数组。可以通过名字来指定进行颜色渲染的数据。
    • 在某些情况下,需要对点属性数据和单元属性数据进行转换,这需要用到两个类vtkCellDataToPointData和vtkPointDataToCellData。转换原理是:当由带属性向单元属性转换时,每个单元属性数据为组成该单元的点对应的属性的平均值;当单元属性数据向点属性数据转换时,点属性为使用该点的单元的属性平均值。

基本图形操作

  • VTK提供了多种基本图形操作:

    • vtkLine提供了点与线、线与线间的距离计算;
    • vtkTriangle提供了面积、外接圆、法向量的计算,点与三角形位置关系的判断;
    • vtkPolygen提供了法向量、重心、面积的计算、点与多边形位置的判断、点与多边形、多边形与多边形相交判断;
    • vtkTetra实现了四面体体积计算、重心计算;
    • vtkMassProperties实现三角网格的表面积和体积计算,但要求网格必须时封闭的三角网格;
    • vtkTriangleFilter可以实现多边形网格向三角网格转换。
  • 测地距离:三维模型上两个点的测地距离是指沿着模型表面两者之间的最短距离,通常采用Dijkstra算法近似求解,VTK中的vtkDijkstraGraphGeodesicPath类可实现测地距离求解。通过GetGeodesicLenght()函数可以获取当前计算的两点测地距离的数值。

  • 包围盒是指能够包围模型的最小立方体,常用于模型的碰撞检测中。vtkOutlineFilter提供一个方便的方法来生成包围盒。

法向量计算

  • 三维平面的法向量是指垂直该平面的向量。某点的法向量为垂直该点切平面的法向量。
  • 在计算网格法向量时,单元法向量可以通过组成每个单元的任意两条边的叉乘向量归并化来表示;二点的法向量则是由使用该点的单元单元法向量的平均值表示。
  • VTK中计算法向量的类为vtkPolyDataNormals,可以通过SetComputeCellNormals()和SetComputePointNormals()来设置需要计算的法向量类型,默认计算点法向量。
  • 计算单元法向量时,要保持单元法向量一致才能得到合理的法向量。SetConsistency()可以自动调整单元点的顺序;SetAutoOrientNormals()可以自动调整法向量方向。
  • 类vtkPolyDataNormals自动开启对锐边缘处理,如果检测到锐边缘,会将其分裂,使图形更加平滑,可通过SetSplitting()函数关闭该功能。

符号化Glyphing

  • 通过符号化(Glyphing)技术将法向量图形化显示。VTK中使用vtkGlyph3D类实现该功能,并支持图形缩放、着色、设置空间姿态等,需要接受两个输入:几何数据点集合、Glyph图形数据(vtkPolyData数据)。几何数据点集合来自求完法向量的图像,Glyph图形数据用于在点集合处显示法向量。

曲率计算

  • 曲率时曲面弯曲程度的一种度量,是几何体的一种重要局部特征。计算曲面M点曲率,考虑经过M的法线的一个平面与曲面相交,可得到一条二维曲线,经过M的法线的平面可以有很多,与曲面相交时可得到多条曲线,取曲率最大和最小的曲线,若其对应曲率为k1和k2,称为主曲率,而该点的高斯曲率为k1*k2,平均曲率为:(k1+k2)/2。
  • VTK中vtkCurvatures类实现了4种网格模型曲率计算方法:
    • SetCurvatureTypeToMaximum():计算最大主曲率;
    • SetCurvatureTypeToMinimum():计算最小主曲率;
    • SetCurvatureTypeToGaussian():计算高斯曲率;
    • SetCurvatureTypeToMean():计算平均曲率。

网格平滑

  • 拉普拉斯平滑是一种网格平滑算法,将每个点用其邻域点的中心来代替,通过不断迭代,得到较为光滑的网格。
  • vtkSmoothPolyDataFilter类,实现了拉普拉斯平滑算法,用SetNumberOfIterations()控制平滑次数,次数越大,平滑越厉害。
    • BoundarySmoothing控制是否对边界点平滑;
    • FeatureEdgeSmoothing控制是否对特征边上的点平滑,通过调用SetFeatureAngle()函数设置特征角阈值。
  • vtkSmoothPolyDataFilter类通过拉普拉斯不断迭代,模型会不断向网格中心收缩。
  • vtkWindowedSincPolyDataFilter类,使用窗口函数Sinc实现网格平滑,能够最下程度避免收缩,使用方法与vtkSmoothPolyDataFilter类相同。

封闭性检测与填补漏洞

  • 如果一条边只被一个多边形包含,那这条边就是边界边,是否存在边界边是检测网格模型是否封闭的重要特征。
  • vtkFeatureEdges类能够提取多边形网格模型中4种类型的边:
    • 边界边;
    • 非流形边;
    • 特征边;
    • 流形边;
  • 可以通过判断边界边的数目来网格是否封闭。
  • 检测出网格是否封闭之后可以通过类vtkFillHoleFilter将漏洞填补起来。

连通区域分析

  • vtkAppendPolyData类可以实现vtkPolyData的合并,使用该类可以方便地构造含有多个连通区域的数据。
  • vtkPolyDataConnectivityFilter类用于实现连通区域分析:
  • SetExtractionModeToLargestRegion():用于提取具有最多点的连通区域;
  • SetExtractionModeToAllRegion():用于连通区域标记,配合函数ColorRegionsOn()一起使用;
  • SetExtractionModeToSpecifiedRegion():用于提取一个或多个连通区域,需要通过AddSpecifiedRegion()来添加需要提取的边界号;

参考:VTK图像处理(二)–vtkPolyData数据处理

参考:

VTK学习笔记(十九)vtk polydata相关推荐

  1. Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法

    Polyworks脚本开发学习笔记(十九)-将数据对象与参考对象对齐的方法 把开发手册理了一遍,发现还有几个点没有记录下来,其中一个就是使用点对的粗对齐和使用参考目标的精确对齐.为了把这个学习笔记凑够 ...

  2. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  3. VTK学习笔记(九)VTK中的各个模块

    VTK中的各个模块 1.各个模块 1.1.头文件 1.2.动态库 2.各个模块的作用 1.各个模块 在前面的几个示例中CMakeLists.txt中有涉及到VTK的组件,因此要整理以下各个组件的作用, ...

  4. VTK学习笔记(九)vtkDiskSource

    vtkDiskSource对象创建一个中间有孔的多边形磁盘.磁盘高度为零.用户可以指定圆盘的内外半径,以及多边形表示的径向和周向分辨率. #include <vtkActor.h> #in ...

  5. 【theano-windows】学习笔记十九——循环神经网络

    前言 前面已经介绍了RBM和CNN了,就剩最后一个RNN了,抽了一天时间简单看了一下原理,但是没细推RNN的参数更新算法BPTT,全名是Backpropagation Through Time. [注 ...

  6. javascript学习笔记(十九) 节点的操作

    包括节点的创建.添加.移除.替换.复制 本节要用到的html例子 1 <ul id="myList"> 2 <li>项目一</li> 3 < ...

  7. 乐优商城学习笔记十九-商品详情(二)

    2.页面静态化 2.1.简介 2.1.1.问题分析 现在,我们的页面是通过Thymeleaf模板引擎渲染后返回到客户端.在后台需要大量的数据查询,而后渲染得到HTML页面.会对数据库造成压力,并且请求 ...

  8. 步步为营 .NET 设计模式学习笔记 十九、Chain of Responsibility(职责链模式)

    概述 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的 ...

  9. angular学习笔记(十九)-自定义指令修改dom

    使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器,服务,一样,可以通过模块实例的directiv ...

  10. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

最新文章

  1. 探索机器学习的公平性(Delayed Impact of Fair Machine Learning)论文 pdf
  2. 对JDBC的一些理解
  3. nginx以unix-domain-socket方式连接fastcgi(php)
  4. 探索 COVID-19 新冠数据来学习 Pandas
  5. C# 错误!!容量超出了最大容量。参数名: capacity 这个是什么问题呢?
  6. BZOJ4943 洛谷3823 UOJ315:[NOI2017]蚯蚓排队——题解
  7. 7-n!末尾有几个0
  8. python解压_python解压
  9. 如何更好地理解Javascript对象的自有属性和原型继承属性
  10. python制作的游戏如何转化为swf_PYTHON实现swf提取
  11. markdown写小于等于号(等于贴着角)\leqslant
  12. 如何将松散的dll打包进需要发布的exe
  13. linux用六维BT
  14. Nginx - 原理机制
  15. W5500调试的部分问题和注意点
  16. R语言画图教程之盒形图
  17. php 设置字符编码为utf-8
  18. RL(Chapter 6): Windy Gridworld
  19. 关于ST-link驱动的问题
  20. 使用DL4J读取词向量并计算语义相似度

热门文章

  1. 基于BS架构的微博系统
  2. 计算机好多个页面,哪些电脑分屏软件好用?好用电脑分屏软件推荐
  3. 让前端走进微时代, 微微一弄很哇塞!
  4. Ant design
  5. 程序猿 网站 | 常用 技术学习网站
  6. CCFCSP非零段划分
  7. 决策树(ID3算法)
  8. TCP协议下的recv函数
  9. 尚德计算机科学与技术网课,计算机科学与技术
  10. vue前端上传文件夹的插件_vue文件上传插件