使用C++来编写VTK项目时,就是要写自己的算法

其实,使用VTK可以使用很多种语言,比如java,python,和C++。那么为什么非要使用C++

呢?一个原因是觉得C++语言处理数据比较快,另一个原因是需要自己写算法。通过继承polyDataAlgorithm来写自己的算法,很有成就感。

比如我们写一个滤波算法,有一堆噪音的数据,然后我们想进行表面重建,显然重建后的表面不好看,因此我们先对数据进行平滑处理。数据的平滑处理有很多种方法,比如跟中模糊算法。这里我们想用一个球平均的算法,比如提取到一些数据点的坐标,然后我们采用波松方程的方法进行平均:

\nabla^2F(x,y)=0

我们假设X和Y是直角坐标系平面上的点,x和y的间距相同。将平面上的一个点,于它四周的四个点进行平均,然后得到这个点的数值。

我们在点(0,0)附近对F函数进行泰勒展开:

F(\pm x,\pm y)=F(0,0)\pm \partial F/ \partial x \times \Delta x \pm \partial F/ \partial y \times \Delta y+ \partial^2F/\partial x^2+\partial^2F/\partial y^2

假设\Delta x=\Delta y=\Delta x,则我们可以得到

F(x,y)=1/4(F(x+\Delta x,y)+F(x+\Delta x,y)+F(x,y+\Delta y)+F(x,y-\Delta y)).

就用这个办法,我们取一个点的四周的四个点,将这四个点的坐标相加,然后取平均,给中间的点,成为中间这个点的坐标。

void myPolyDataMovingAverageFilter::CenterOfMass(vtkPoints *points, double center[3]){center[0]=0;center[1]=0;center[2]=0;for(vtkIdType i=0;i<points->GetNumberOfPoints();++i){double point[3];points->GetPoint(i,point);vtkMath::Add(center,point,center);}double numberOfPoints=static_cast<double>(points->GetNumberOfPoints());vtkMath::MultiplyScalar(center,1.0/numberOfPoints);
}

我们需要继承polydataalgorithm算法,然后重写requestdata方法

int myPolyDataMovingAverageFilter::RequestData(vtkInformation *request,vtkInformationVector **inputVector,vtkInformationVector *outputVector){// get inputvtkInformation *inInfo=inputVector[0]->GetInformationObject(0);vtkPolyData* input=vtkPolyData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT()));vtkInformation *outInfo=outputVector->GetInformationObject(0);vtkPolyData* output=vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));vtkSmartPointer<vtkPoints> newPoints=vtkSmartPointer<vtkPoints>::New();newPoints->SetNumberOfPoints(input->GetNumberOfPoints());vtkSmartPointer<vtkKdTreePointLocator> kdTree=vtkSmartPointer<vtkKdTreePointLocator>::New();kdTree->SetDataSet(input);kdTree->BuildLocator();for(vtkIdType pointId=0;pointId<input->GetNumberOfPoints();++pointId){vtkSmartPointer<vtkIdList> neighborIds=vtkSmartPointer<vtkIdList>::New();double p[3];input->GetPoint(pointId,p);kdTree->FindPointsWithinRadius(Radius,p,neighborIds);vtkSmartPointer<vtkPoints> neighbors=vtkSmartPointer<vtkPoints>::New();for(vtkIdType neighborId=0;neighborId<neighborIds->GetNumberOfIds();++neighborId){double neighbor[3];input->GetPoint(neighborIds->GetId(neighborId),neighbor);neighbors->InsertNextPoint(neighbor);}double center[3];CenterOfMass(neighbors,center);newPoints->SetPoint(pointId,center);}vtkSmartPointer<vtkPolyData> newPolyData=vtkSmartPointer<vtkPolyData>::New();newPolyData->SetPoints(newPoints);vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter=vtkSmartPointer<vtkVertexGlyphFilter>::New();glyphFilter->SetInputData(newPolyData);glyphFilter->Update();output->ShallowCopy(glyphFilter->GetOutput());return 1;
}

进行算法的测试,我们使用一个spheresource创建数据,再给它加上噪音。然后对数据进行平滑处理,我们看看这些球面上的点分布如何。

图1 运行结果

从运行结果上看,噪音被滤除掉了,小球变得圆滑起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RK3588 Linux 5.x 内核编程】-等待队列(WaitQueue)

等待队列(WaitQueue) 文章目录 等待队列(WaitQueue)1、等待队列介绍2、等待队列初始化2.1 静态初始化2.2 动态初始化3、队列任务排队3.1 wait_event3.2 wait_event_timeout3.3 wait_event_cmd3.4 wait_event_interruptible3.5 wait_event_interruptible_timeout3.6 wait_ev…

[ 内网渗透实战篇-2 ] 父域子域架构的搭建与安装域环境判断域控定位组策略域森林架构配置信任关系

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

unity c# Tcp网络通讯

本篇附带源代码&#xff0c;带有处理拆包分包粘包&#xff0c;也会撰明具体内容。 首先对于tcp就是挥手机制&#xff0c;三次握手四次挥手机制。 一、三次握手 具体过程为简单解释为&#xff1a; 1、客户端请求服务器链接&#xff0c;等待服务器确认。&#xff08;服务器如…

FileLink跨网数据摆渡系统:打破网络隔阂,轻松实现跨网络数据传输

在数字化时代&#xff0c;跨网络、跨区域的数据传输成为了企业和个人信息流通的重大挑战。而如今&#xff0c;FileLink跨网数据摆渡系统的问世&#xff0c;彻底解决了这一难题&#xff0c;帮助用户实现快速、安全、无缝的跨网络数据传输。 1. 跨网络数据传输的痛点 随着企业信…

高级 SQL 技巧详解

文章目录 高级 SQL 技巧详解一、引言二、窗口函数1、窗口函数的使用1.1、RANK() 函数示例1.2、常用窗口函数 三、公共表表达式&#xff08;CTE&#xff09;2、CTE 的使用2.1、CTE 示例 四、索引优化3、索引的创建与优化3.1、创建索引3.2、索引类型与注意事项 五、事务管理4、事…

MySQL_聚合函数分组查询

上篇复习&#xff1a; 设计数据库时的三大范式1.第一范式&#xff0c;一行数据中每一列不可再分 关系型数据库必须要满足第一范式&#xff0c;设计表的时候&#xff0c;如果每一列都可以用SQL规定的数据类型描述&#xff0c;就天然满足第一范式. 2.第二范式&#xff0c;在第一…

【Ai教程】Ollma安装 | 0代码本地运行Qwen大模型,保姆级教程来了!

我们平时使用的ChatGPT、kimi、豆包等Ai对话工具&#xff0c;其服务器都是部署在各家公司的机房里&#xff0c;如果我们有一些隐私数据发到对话中&#xff0c;很难保证信息是否安全等问题&#xff0c;如何在保证数据安全的情况下&#xff0c;又可以使用大预言模型&#xff0c;O…

FastAPI全方位分析:优劣尽显

近年来,随着技术的飞速发展,快速构建高性能API的需求越来越强烈。Python作为一个广泛使用的编程语言,也在这一领域下涌现出了许多优秀的框架。FastAPI便是其中一颗璀璨的新星。 FastAPI以其卓越的性能和独特的功能吸引了众多开发者。本文将深入剖析FastAPI的各个方面,详细…

LongVU :Meta AI 的解锁长视频理解模型,利用自适应时空压缩技术彻底改变视频理解方式

Meta AI在视频理解方面取得了令人瞩目的里程碑式成就&#xff0c;推出了LongVU&#xff0c;这是一种开创性的模型&#xff0c;能够理解以前对人工智能系统来说具有挑战性的长视频。 研究论文 "LongVU&#xff1a;用于长视频语言理解的时空自适应压缩 "提出了一种革命…

二分答案—愤怒的牛-P1676 [USACO05FEB] Aggressive cows G

[USACO05FEB] Aggressive cows G 题目描述 农夫约翰建造了一座有 n n n 间牛舍的小屋&#xff0c;牛舍排在一条直线上&#xff0c;第 i i i 间牛舍在 x i x_i xi​ 的位置&#xff0c;但是约翰的 m m m 头牛对小屋很不满意&#xff0c;因此经常互相攻击。约翰为了防止牛之…

什么是兼容性测试

兼容性测试&#xff0c;提供具有兼容性特性的云端设备&#xff08;覆盖主流品牌、SDK、分辨率&#xff09;&#xff0c;通过模拟用户行为进行真机测试。及时有效的发现应用中存在的兼容性问题。解除测试人员的双手&#xff0c;提高测试效率&#xff0c;保证产品在海量真机上的高…

IDEA:ctrl+/ 快捷键生成的注释,设置“//”开始位置

问题场景&#xff1a; IDEA中使用 ctrl/ 快捷键&#xff0c;//显示在最左边&#xff08;顶格&#xff09;&#xff0c;不美观&#xff0c;中间隔了好长的空格&#xff0c;如图&#xff1a; 解决方法: 操作步骤 File–>Sttings–>Editor–>Code Style–>Java–>…

中文文章进行加密编码及解码的方法python实现

愿我们终有重逢之时,而你还记得我们曾经讨论的话题。 group 868373192 second group 277356808 在Python中,可以使用多种方法对中文文章进行加密编码及解码。以下是几种常见的方法: 1. 使用Base64编码 Base64是一种基于64个可打印字符来表示二进制数据的编码方式。它可以…

掌握springboot过滤器,拦截器 ,aop

前言&#xff1a; Spring Boot 中的过滤器&#xff08;Filter&#xff09;、拦截器&#xff08;Interceptor&#xff09;和 AOP&#xff08;面向切面编程&#xff09;都是处理请求的常用技术&#xff0c;但它们在处理请求的时机、范围和方式上有所不同。下面详解分别介绍&#…

XLA中生成Causal Mask上三角-inf矩阵

transformers生成CausalAttentionMask的上三角-inf矩阵&#xff1a; 参考transformers源码 import torch import torch_xla import torch_xla.core.xla_model as xm import osos.environ[PJRT_DEVICE]IPU # os.environ[PJRT_DEVICE]GPU # os.environ[XLA_FLAGS]--xla_dump_tog…

IDEA2024下安装kubernetes插件并配置进行使用

【1】安装插件 其实2024.2.3下默认已经安装了kubernetes插件&#xff0c;如果你发现自己IDEA中没有&#xff0c;在市场里面检索并下载即可。 【2】kubernetes配置 ① 前置工作 首先你要准备一个config文件和一个kubectl.exe 。 config文件类似如下&#xff1a; apiVersi…

H7-TOOL的CAN/CANFD助手增加帧发送成功标识支持, 继续加强完善功能细节

2.27版本固件正式携带此功能&#xff0c;包括之前做的负载率检测和错误信息展示也将集成到这个版本固件中。 对于接收&#xff0c;我们可以直接看到效果&#xff0c;而发送不行&#xff0c;所以打算在发送的地方展示下发送成功标识。CAN发送不像串口&#xff0c;需要等待应答后…

微调LLM时,full、freeze、lora区别

LLama-Factory支持full、freeze、lora三种微调&#xff0c;区别&#xff1a; Full微调&#xff1a;Full微调是指在微调过程中更新整个模型的所有参数。这意味着所有的层和参数都会被更新&#xff0c;并且在微调期间都会参与训练。Full微调通常用于对模型进行全面的调整&#xf…

CSP/信奥赛C++刷题训练:经典广搜例题(4):洛谷P1746 :离开中山路

CSP/信奥赛C刷题训练&#xff1a;经典广搜例题&#xff08;4&#xff09;&#xff1a;洛谷P1746 &#xff1a;离开中山路 题目背景 《爱与愁的故事第三弹shopping》最终章。 题目描述 爱与愁大神买完东西后&#xff0c;打算坐车离开中山路。现在爱与愁大神在 x 1 , y 1 x_1…

CST汽车天线仿真(双向混合求解)

CST从2018版本开始具有双向混合求解&#xff0c;到2019版已经通用微波工作室的各个求解器之间的双向混合。具体的混合对象如下图&#xff1a; 对天线的安装和耦合仿真&#xff0c;意味着对复杂结构&#xff08;天线&#xff09;和电大尺寸环境&#xff08;安装平台&#xff0c;…