VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒
来源:互联网 发布:java mongodb orm框架 编辑:程序博客网 时间:2024/05/16 09:04
1.基本图形操作意义
图形处理,比如图形平滑、多分辨率分析、特征提取等都离不开一些基本的图形操作。掌握这些基本的图形操作有助于理解和深入学习图形处理和分析方法。VTK中提供了多种图形的基本操作,其中最简单的是点的欧氏距离计算,可以使用vtkMath进行计算,也可以直接计算向量的模。一些图元类提供了许多可以方便使用的静态函数,如vtkLine提供了点与线间的距离计算;vtkTriangle提供了面积、外接圆、法向量的计算,点与三角形位置关系判断等;vtkTetra中实现了四面体体积,重心计算等。有了这些函数,可以实现很多其他功能,如计算一个三角网格模型的表面积,只需要遍历每个三角形单元并计算其面积即可。另外,还有一个办法是vtkMassProperties。这个类可以实现三角网格的表面积和体积计算,但是要求网格必须是封闭的三角形网格数据。网格的封闭性计算在后面会有更加详细的讨论。对于非三角形网格,需要先将网格转换为三角形网格。vtkTriangleFilter可以实现多边形网格数据向三角形网格数据转换。
2.三角网格模型面积、体积计算
利用vtkMassProperties计算三角网格模型面积、体积代码如下:#include <vtkAutoInit.h>VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>#include <vtkCubeSource.h>#include <vtkTriangleFilter.h> //其他网格类型转换成三角网格类型#include <vtkMassProperties.h> //计算三角网格的基本属性 面积。体积等#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkProperty.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkRenderWindowInteractor.h>int main(){vtkSmartPointer<vtkCubeSource> cubeSource =vtkSmartPointer<vtkCubeSource>::New(); //vtkPolyData类型数据cubeSource->Update();vtkSmartPointer<vtkTriangleFilter> triFilter =vtkSmartPointer<vtkTriangleFilter>::New();triFilter->SetInputData(cubeSource->GetOutput());triFilter->Update();vtkSmartPointer<vtkMassProperties> massProp =vtkSmartPointer<vtkMassProperties>::New();massProp->SetInputData(triFilter->GetOutput());float Volume = massProp->GetVolume();float SurfaceArea = massProp->GetSurfaceArea();float maxArea = massProp->GetMaxCellArea();float minArea = massProp->GetMinCellArea();std::cout << "the Volume : " << Volume << std::endl;std::cout << "Surface Area : " << SurfaceArea << std::endl;std::cout << "MaxAreaofCell: " << maxArea << std::endl;std::cout << "MinAreaofCell: " << minArea << std::endl;///////////////////////////////////////////////////////////vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(triFilter->GetOutput());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetColor(0, 0, 1);actor->GetProperty()->SetEdgeColor(1, 0, 0);actor->GetProperty()->SetEdgeVisibility(1);vtkSmartPointer<vtkRenderer> render =vtkSmartPointer<vtkRenderer>::New();render->AddActor(actor);render->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(render);rw->SetSize(480, 420);rw->SetWindowName("Calculating Area and Volume of Triangle grid");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0;}其输出结果为:
3.三维网格测地距离
对于三维网格模型来讲,测地距离也是一种重要的距离度量。与欧氏距离不同,一个三维模型上的亮点测地距离是指沿着模型表面两者之间的最短距离。测地距离通常采用Dijkstra算法类近似求解。VTK中的vtkDijkstraGraphGeodesicPath类就可以实现测地距离的求解。该类的使用如下例所示:#include <vtkAutoInit.h>VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle); #include <vtkSmartPointer.h>#include <vtkSphereSource.h>#include <vtkDijkstraGraphGeodesicPath.h>#include <vtkProperty.h>#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkRenderWindowInteractor.h>int main(){vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->Update();vtkSmartPointer<vtkDijkstraGraphGeodesicPath> dijstra =vtkSmartPointer<vtkDijkstraGraphGeodesicPath>::New();dijstra->SetInputData(sphereSource->GetOutput());dijstra->SetStartVertex(0);dijstra->SetEndVertex(10);dijstra->Update();///////////////////////////////////////////////////////////////vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(sphereSource->GetOutput());vtkSmartPointer<vtkPolyDataMapper> pathMapper =vtkSmartPointer<vtkPolyDataMapper>::New();pathMapper->SetInputData(dijstra->GetOutput());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkActor> pathActor =vtkSmartPointer<vtkActor>::New();pathActor->SetMapper(pathMapper);pathActor->GetProperty()->SetColor(1, 0, 0);pathActor->GetProperty()->SetLineWidth(5);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->AddActor(pathActor);renderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(renderer);rw->SetSize(640, 480);rw->SetWindowName("Calculating Geodesic Path");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0;}在这个例子中,我们定义了一个球形。计算测地距离时,必须指定球面两个点的索引号。SetStartVertex()设置开始点;SetEndVertex()设置结束点;计算完毕后,通过GetOutPut()函数可以得到一个vtkPolyData数据,即最短路径数据,其实质为折线段集合。最终结果,如下图所示:
3.三维图像的包围盒
包围盒是指能够包围模型的最小立方体,常常用于模型的碰撞测量中。vtkPolyData中定义了函数GetBounds()来获取包围盒的参数。即三个坐标轴方向上的最大、最小值。仅仅获取这些参数并不直观,有时候还需要显示包围盒。vtkOutlineFilter则提供了一个方便的方法来生成包围盒,其输入为一个vtkPolyData莫形数据,输出同样为一个vtkPolyData类型数据,因此非常容易进行可视化显示。实例的参考代码如下所示:#include <vtkAutoInit.h>VTK_MODULE_INIT(vtkRenderingOpenGL);VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>#include <vtkSphereSource.h>#include <vtkProperty.h>#include <vtkOutlineFilter.h>#include <vtkPolyData.h>#include <vtkPolyDataMapper.h>#include <vtkActor.h>#include <vtkRenderer.h>#include <vtkRenderWindow.h>#include <vtkRenderWindowInteractor.h>int main(){vtkSmartPointer<vtkSphereSource> sphereSource =vtkSmartPointer<vtkSphereSource>::New();sphereSource->SetCenter(0.0, 0.0, 0.0);sphereSource->SetRadius(5.0);sphereSource->Update();vtkPolyData* sphere = sphereSource->GetOutput();vtkSmartPointer<vtkOutlineFilter> outline =vtkSmartPointer<vtkOutlineFilter>::New();outline->SetInputData(sphere);outline->Update();//算法执行完毕,必须更新!!!vtkSmartPointer<vtkPolyDataMapper> mapper =vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(sphere);vtkSmartPointer<vtkPolyDataMapper> outlineMapper =vtkSmartPointer<vtkPolyDataMapper>::New();outlineMapper->SetInputData(outline->GetOutput());vtkSmartPointer<vtkActor> actor =vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);vtkSmartPointer<vtkActor> outlineActor =vtkSmartPointer<vtkActor>::New();outlineActor->SetMapper(outlineMapper);outlineActor->GetProperty()->SetColor(0, 1, 0);outlineActor->GetProperty()->SetLineWidth(3);vtkSmartPointer<vtkRenderer> renderer =vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->AddActor(outlineActor);renderer->SetBackground(0, 0, 0);vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(renderer);rw->SetSize(640, 480);;rw->SetWindowName("PolyData Bounding Box");rw->Render();vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);rwi->Start();return 0;}其输出结果如下图所示:
4.参看资料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.
0 0
- VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒
- VTK修炼之道49:图形基本操作进阶_网格平滑(点云的曲面重建技术)
- VTK修炼之道50:图形基本操作进阶_网格模型的特征边 与 封闭性检测
- VTK修炼之道54:图形基本操作进阶_表面重建技术(三角剖分)
- VTK修炼之道47:图形基本操作进阶_法向量计算
- VTK修炼之道51:图形基本操作进阶_连通区域分析
- VTK修炼之道59:图形基本操作进阶_纹理映射
- VTK修炼之道48:图形基本操作进阶_符号化操作与模型区率计算
- VTK修炼之道52:图形基本操作进阶_多分辨率策略(模型抽取的三种方法)
- VTK修炼之道53:图形基本操作进阶_多分辨率策略(模型细化的三种方法)
- VTK修炼之道55:图形基本操作进阶_表面重建技术(等值面提取)
- VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)
- VTK修炼之道58:图形基本操作进阶_点云配准技术(迭代最近点ICP算法)
- VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)
- VTK修炼之道45:图形进阶_vtkPolyData属性数据
- VTK修炼之道19:图像基本操作_图像像素值的访问与修改
- VTK修炼之道20:图像基本操作_图像类型转换
- VTK修炼之道21:图像基本操作_彩色图像生成灰度图像
- js事件对象获取兼容写法
- c++单向链表-数据结构
- iOS 分享数据到其它app(open in other app)
- 20170202 Coursera Stanford-MachineLearning/Week9
- eclipse中项目运行时报错之 Compilation error解决方法
- VTK修炼之道46:图形基本操作进阶_三角网格体积、表面积、测地距离、包围盒
- Unity游戏开发之“屏幕截图
- 应用background-position实现css视差效果
- C++数组,字符串,string,结构,共用体,枚举,指针,静态动态内存,vector及array类简介
- JAVA中的四种Reference
- android开源项目view篇
- Android开发:该视频无法播放
- Spoj Query on a tree SPOJ - QTREE(树链剖分+线段树)
- Synchronized 浅析