VTK_Learning_三角网格体积、表面积、测地距离、包围盒_三角面封闭体积_江南又旧雨的博客-程序员秘密

技术标签: # VTK修炼学习  vtk  测表面距离  

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

 

4.三维图像的包围盒 

 包围盒是指能够包围模型的最小立方体,常常用于模型的碰撞测量中。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;
}

其输出结果如下图所示:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38293453/article/details/104620888

智能推荐

PYQT5从数据库读取数据构建QTreeWidget节点_guardianff的博客-程序员秘密

PYQT5从数据库读取数据构建QTreeWidget节点 def sql_select(self): self.itemidlist = [] self.nolist = [] sql = 'select * from [ICItem]' # 实例化数据库连接查询类 ICItem_date = Select_Table() # 使用select_access方法获取数据库表中所有数据的二维列表

springboot+websocket环境下session会话信息在异步编程中如何同步shrio登录和会话信息_springboot websocket session_黄锦平的博客-程序员秘密

看到许多博客里都是通过前端建立websocket请求时将用户信息传递给后端并绑定到websocket的实例中,这样也能满足需求,但是针对粒度要达到会话级别的时候,同时系统采用异步编程时,这个做法就无法满足业务场景了,同时这对前端还有侵入性。另大多数博客都没讲清原理,此处为加深自己记忆,整理一份文档,助和我曾经一样的小白们快速理解。场景说明:1、如果系统收到请求后将数据交给线程池异步执行,并...

‘QMainWindow‘ object has no attribute ‘accept‘_陈 zv的博客-程序员秘密

根据一些教程使用python和pyqt5编写界面时候出现警告‘QMainWindow’ object has no attribute ‘accept’原教程代码为:import sysfrom PyQt5.QtWidgets import QApplication, QDialog, QMainWindowimport Ui_mainwinif __name__ == '__main__': app = QApplication(sys.argv) MainWindow =

关于运动控制系统软件架构设计_c#运动控制框架设计_dch4890164的博客-程序员秘密

运动控制系统软件架构设计的难点:一.客户的需求总是根据实际的需要不断的增加   由于工业生产的需要,需求总是不断的被提出,而且国内运动控制系统软件起步较晚,还处在不断的摸索当中,更多的时候还是仿照国外运动控制软件进行开发,由于软件开发在整个运动控制系统开发的被动性(相对于机械系统和电气系统,软件系统是最容易被修改的而且其成本也是最廉价的),基于以上因素在软件系统架构设计的时候必须考虑框

电脑如何开启卓越性能模式_w7卓越性能_わ雾锁晴空ぬ的博客-程序员秘密

电脑如何开启卓越性能模式电脑如何开启卓越性能模式我想大家平时玩游戏的时候都会有疑惑,为什么我买的电脑也不差,为什么会经常卡顿呢?有很多时候是因为没有开启卓越性能的原因,下面就给大家讲一下如何开启卓越性能吧。首先按Windows键或者点击桌面角落的开始然后搜索并打开控制面板打开电源或电池相关选项,我的是电源,其他的也有可能不一样,具体看自己电脑选择高性能再次点开开始菜单,搜索并打开开Windows PowerShell(管理员):输入powercfg -duplicateschem

OpenWRT LEDE固件安装_Phillweston的博客-程序员秘密

OpenWRT LEDE固件安装链接如下:【2020】最新编译OpenWrt X86-64纯净版软路由固件镜像下载 LEDE精简版-多功能版-旁路由固件不推荐使用koolshare版本的固件,bug很多,经常断流注意:一定看仔细到底烧录的是哪个盘,千万不要不看提示操作!烧录的时候,如果是硬盘里面烧录,推荐使用physdiskwrite,用etcher烧录会失败命令添加参数:physdiskwrite -u ,目的是取消磁盘2G大小限制被烧录的磁盘的所有分区都要删除,否则烧录仍然会失败

随便推点

【转】JIRA JQL, 更灵活地跟踪缺陷、问题、任务。。。(2/4)_weixin_34306676的博客-程序员秘密

函数:为什么它们很酷?在JIRA中,字段存贮了与问题相关的数据。问题字段包含了:优先性、问题关键、问题详情等。函数本身有很多强大的功能,可以包含很多复杂的逻辑,但是这些复杂逻辑可以通过简单的方式表达出来。函数可以有选择地接收输入内容,并返回结果。比如,JIRA支持一个叫做membersof()的函数,如果用户是小组的一部分将会返回Tr...

rg.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unab_liulei88的博客-程序员秘密

at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)

嘿~来说说Android点击事件分发和处理_weixin_34315485的博客-程序员秘密

先说个小事情onXXXXXX()方法都是对当前View的某个操作进行实际的处理。比如,onDraw()是对View的实际绘制,onMeasure()是对View进行实际的测量,onLayout()是进行实际的布局,onTouchEvent()是对点击事件进行处理,onInterceptTouchEvent()是对是否拦截事件进行处理。再说一个小事情点击事件正常情况下就4个类型,一般处理这4...

Toonboom Storyboard Pro 8中文版_缘澄绪的博客-程序员秘密

教程:1.安装完成后,运行文件“Storyboard-Pro_8-6-1_Activation.exe”,2.文件安装完成后,点击finish退出3.打开软件,完成,可使用所有功能4、完成,就可以使用了,资源地址:Toonboom Storyboard Pro 8中文版...

react mobx状态管理_qq_21138747的博客-程序员秘密

//list.jsconst { Button } = WeaverMobile;const { TabBar, Icon,Tabs, WhiteSpace, Badge ,Accordion, List} = WeaverMobile;const { Provider,inject,observer } = mobxReact;const { NavBar } = WeaverMobile;const { Carousel, WingBlank } = WeaverMobile;const {

jQuery fancybox使用_weixin_30768661的博客-程序员秘密

准备工作:先到fancybox的官方网站下载相应的fancybox插件,网址是http://www.fancybox.net / ,其实这个非常简单,可能情况是程序员一般是比较懒的动物,然后将最常用的弹出层效果抽取出来,fancybox插件中用到的组件图片放在 fancybox文件夹中,css文件就是style.css,所以fancybox是非常灵活的,完全可以自己定制样式。HTML st...

推荐文章

热门文章

相关标签