VTK中如何 搜索 目标点 最近的点或者点集( vtkPointLocator )

news2024/12/26 21:00:32

背景:

        在vtk使用过程中,我们有时要搜索点或者cell最近的 单元,  仔细看源码,有时无法判断其具体是什么样子,因而这里做了可视化处理,方便我们更深刻的理解 vtkPointLocator  类型函数的使用;

过程:

1.了解其继承关系是必要的:

 

2.开始探索该函数的一些效果:

我们会将原始数据以 绿色 小球表示,   范围 R 用白色透明标识 , 搜索到的点,用 蓝色标识

2.1. 准备数据集.

        

                std::vector<std::array<double, 3>> mPointSource;


				//vtkNew<vtkMinimalStandardRandomSequence> rm;
				准备一份数据..... 包含 几何数据,以及 拓扑数据.
				//for (size_t i = 0; i < 8; i++)
				//{
				//	//随机点
				//	auto x = rm->GetRangeValue(-10,10);
				//	rm->Next();

				//	auto y = rm->GetRangeValue(-10, 10);
				//	rm->Next();

				//	auto z = rm->GetRangeValue(-10, 10);
				//	rm->Next();
				//	std::array<double, 3> curTempValue{x,y,z};
				//	mPointSource.emplace_back(curTempValue);
				//}


				//将原始的数据,设计成一条折线.
				mPointSource.emplace_back(std::array<double, 3>{0,0,0});
				mPointSource.emplace_back(std::array<double, 3>{10, -10, 0});
				mPointSource.emplace_back(std::array<double, 3>{20, 10, 0});
				mPointSource.emplace_back(std::array<double, 3>{30, -80, 0});
				mPointSource.emplace_back(std::array<double, 3>{40, 12, 0});
				mPointSource.emplace_back(std::array<double, 3>{80, 0, 0});

2.2,具体创建过程: 

2.2.1

       FindClosestPoint () 我们先看这个函数的效果.

vtkNew<vtkPoints> mVtkPs;
				vtkNew<vtkCellArray> mTopoCells;
				for (auto& item : mPointSource)
				{
					mVtkPs->InsertNextPoint(item[0], item[1], item[2]);
				}

				//连接线.
				auto cutPNumber = mVtkPs->GetNumberOfPoints();
				for (size_t i = 1; i < cutPNumber; i++)
				{
					
					vtkNew<vtkLine> curLine;
					curLine->GetPointIds()->SetId(0, i-1);
					curLine->GetPointIds()->SetId(1, i);
					mTopoCells->InsertNextCell(curLine);
				
				}
				
				vtkNew<vtkPolyData> mPolydata;
				mPolydata->SetPoints(mVtkPs);
				mPolydata->SetLines(mTopoCells);
				
				//显示原始对象.
				auto mActor = VtkCreatorHelper::CreateActorFromInputData(mPolydata);
				mRender->AddActor(mActor);

				//显示点.
				vtkNew<vtkPolyData> mPointPolydata;
				mPointPolydata->ShallowCopy(mPolydata);
				auto mPointActor = VtkCreatorHelper::CreateActorFromInputData(mPointPolydata);
				mPointActor->GetProperty()->SetPointSize(4);
				mPointActor->GetProperty()->SetColor(0,1.0,0);
				mPointActor->GetProperty()->SetRepresentationToPoints();
				mRender->AddActor(mPointActor);



				auto printPoint = [=](std::string str, double* value) {

					std::cout << str.c_str() << "  " << value[0] << " " << value[1] << " " << value[2] << std::endl;

				};

switch (locatorType)
				{
				case 0:
				{

					//获取最近的距离...并将这个距离显示成
					{

						vtkNew<vtkPointLocator> mPointLocator; //使用点查询....
						mPointLocator->SetDataSet(mPolydata);
						mPointLocator->BuildLocator();
						mPointLocator->Update();

						VtkCreatorHelper::PrintVtkObjectInfo(mPointLocator);//输出.
						auto outFilterActor = VtkCreatorHelper::CreateActorFromBounds(mPointLocator->GetBounds());
						mRender->AddActor(outFilterActor);

						//查询一.
						int searchType = 1;
						switch (searchType)
						{
						case 0:
						{

							//查询单独的点.
							double testP[3]{ 20, 5, 0 };//20, 10, 0  1,2,3
							auto findID = mPointLocator->FindClosestPoint(testP);
							if (findID != -1)
							{
								auto findP = mPolydata->GetPoint(findID);
								printPoint("要查的点 : ", testP);
								printPoint("查找到的点: ", findP);
								auto findActor = VtkCreatorHelper::CreateVtkSphereSource(findP[0], findP[1], findP[2], 3, 1.0, 1.0, 1.0, 0.6);
								mRender->AddActor(findActor);
							}
							break;
						}

该显示效果.

 2.2.2

        FindPointsWithinRadius() 我们再来看这个函数的效果. 注意这里的半径,以及搜索列表写法.

case 1:
						{
							//按照半径,查询
							double testP[3]{ 20, 5, 0 };

							printPoint("要查的点 : ", testP);
							double R = 20;
							vtkNew<vtkIdList> mList;
							mPointLocator->FindPointsWithinRadius(R, testP, mList);

							//绘制R为半径的圆.
							auto RActor = VtkCreatorHelper::CreateVtkSphereSource(testP[0], testP[1], testP[2], R, 1.0, 1.0, 1.0, 0.3);
							mRender->AddActor(RActor);

							auto getPointsNumber = mList->GetNumberOfIds();
							for (size_t i = 0; i < getPointsNumber; i++)
							{
								auto findP = mPolydata->GetPoint(mList->GetId(i));
								printPoint("查找到的点: ", findP);
								auto findActor = VtkCreatorHelper::CreateVtkSphereSource(findP[0], findP[1], findP[2], 3, 0.0, 0.0, 1.0);
								mRender->AddActor(findActor);
							}

							break;
						}

 

2.2.3 其他的函数使用方式,都和上面 两种方式一个样子,这里改出他们的理解

	case 2:
						{

							//mPointLocator->FindClosestPointWithinRadius(); 这个本身就是在 Radius内部,查询众多点中,距离目标TestPoint最近的点.

							break;
						}
						case 3:
						{

							//mPointLocator->FindClosestInsertedPoint(); 寻找插入点,最近的点.
							break;
						}

2.2.4 特殊的一种巡点方式,是分布式.这个理解起来比较啰嗦. 我这里给出解释.

	case 4:
						{
							//mPointLocator->FindDistributedPoints(); 
							//这个没理解.仔细看一下:  这个函数是在分布式下进行查点搜寻的.  加快搜索速度,注意,结构必须也是 vtkDistributedDataSet 类型.
							/*
							需要注意的是,FindDistributedPoints 函数需要满足一定的条件才能使用。具体来说,要使用 FindDistributedPoints 函数,需要满足以下条件:
							数据集必须是 vtkDistributedDataSet 类型。
							数据集必须被正确地分割成多个部分,并且每个部分都被正确地分配给了不同的计算节点。
							数据集的每个部分必须包含一个 vtkPointSet,并且这些 vtkPointSet 必须包含完整的点坐标信息。
							如果满足以上条件,就可以在分布式计算环境中使用 FindDistributedPoints 函数进行点集操作了。
							*/
						}

希望能帮助一些想要学习vtk的小伙伴

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

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

相关文章

vmware安装redhat enterprise linux server 9.1

vmware安装redhat enterprise linux server 9.11、安装系统1.1 镜像文件2、更新系统2.1 注册系统到redhat软件仓库2.2 更新系统1、安装系统 1.1 镜像文件 官网下载&#xff1a;https://developers.redhat.com/products/rhel/download 2、更新系统 2.1 注册系统到redhat软件…

【编写中】html5+go+websocket不到150行代码,实现一个在线实时聊天的功能

阮一峰websocket 相关参考 websocket 什么是websocket 在了解什么是websocket之前&#xff0c;我们下说一说http&#xff0c;因为HTTP我们太熟了。我们知道&#xff0c;HTTP是一种基于应用层的网络协议&#xff0c;往往都是一个请求&#xff0c;一个相应。websocket呢&#…

为啥用 时序数据库 TSDB

前言 其实我之前是不太了解时序数据库以及它相关的机制的&#xff0c;只是大概知晓它的用途。但因为公司的业务需求&#xff0c;我意外参与并主导了公司内部开源时序数据库influxdb的引擎改造&#xff0c;所以我也就顺理成章的成为时序数据库“从业者”。 造飞机的人需要时刻…

VMware vCenter Server的安装和使用

准备工作 首先去官网下载好VCenter Server&#xff0c;然后准备安装&#xff0c;我这里下载的是6.0对应的镜像为VMware-VIMSetup-all-6.0.0-2656757.iso 需要注意&#xff1a; 开始安装 和安装其他操作系统一样&#xff0c;把镜像放入光驱或解压缩&#xff0c;我这里是在…

Dropout Reduces Underfitting论文解读

Dropout 在欠拟合的应用Dropout Reduces Underfitting&#xff08;2023.3.2&#xff09;写在前面摘要一、简介二、重新审视过拟合和欠拟合三、Dropout如何减少欠拟合四、方法五、实验早期随机失活分析晚期随机失活&#xff08;Late Dropout&#xff09;六、下游任务七、相关工作…

【零代码工具推荐】Max Creation Graph (MCG) 可视化图形编程工具

从3dMax 2016开始新加入了一个很牛great的功能&#xff0c;也就是“MCG”全称是Max Creation Graph&#xff0c;MCG可以让用户使用全可视化节点工作流程来创建修改器&#xff0c;几何体工具插件&#xff0c;使用MCG&#xff0c;可以创建一个新的插件&#xff0c;没错是插件&…

【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(下)

系列文章目录 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(上) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate)12.2实时异构同步Oracle数据部署方案(中) 【大数据实时数据同步】超级详细的生产环境OGG(GoldenGate…

要点提炼|《数字中国建设整体布局规划》,看这一篇就够了!

《数字中国建设整体布局规划》/// 近日&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》&#xff08;以下简称“《规划》”&#xff09;&#xff0c;作为影响中国未来发展的重磅文件&#xff0c;被业界评价为“数字挂帅时代来临”。《数字中国建设整体布局规划…

【持续集成】Jenkins详细教程

文章目录一、jenkins是什么&#xff1f;二、CI/CD是什么&#xff1f;三、使用Jenkins进行PHP代码(单元)测试、打包。1.General2.源码管理3.构建触发器4.构建环境5.构建6.构建后操作7.其他相关配置四、进行jenkins project 构建五、构建结果说明六、jenkins权限管理最后&#xf…

【拼图】拼图游戏-微信小程序开发流程详解

还记得小时候玩过的经典拼图游戏吗&#xff0c;上小学时&#xff0c;在路边摊用买个玩具&#xff0c;是一个正方形盒子形状&#xff0c;里面装的是图片分割成的很多块&#xff0c;还差一块&#xff0c;怎么描述好呢&#xff0c;和魔方玩具差不多&#xff0c;有没有听说叫二维的…

【Leetcode——重排链表】

文章目录一、重排链表思路1.思路2.总结一、重排链表 对于这道题&#xff0c;有两种思路&#xff1a; 思路1. 1.使用一个线性表&#xff0c;存储链表中的每个节点&#xff0c;然后按照题目的条件&#xff0c;来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中的…

硬件学习 软件 Cadence day09 芯片PCB 封装导出DXF 文件

1.打开自己要导出 DXF 文件的 PCB 封装 (Allegro 软件) 2.导出DXF 文件的按钮 1.点击按钮&#xff0c;打开窗口 2.填写数据 3. 按下 Edit... 按钮 4. 编辑数据 5. 导出数据 &#xff0c;生成DXF 文件 下面的选项自己选择 &#xff1a; Color mapping &#xff1a; …

希腊字母及读音

希腊字母24个希腊字母分别是&#xff1a;Αα、Ββ、Γγ、Δδ、Εε、Ϝϝ、Ζζ、Ηη、Θθ、Ιι、Κκ、Λλ、Μμ、Νν、Ξξ、Οο、Ππ、Ρρ、Σσ、Ττ、Υυ、Φφ、Χχ、Ψψ、Ωω。拼写Α α&#xff1a;阿尔法 AlphaΒ β&#xff1a;贝塔 BetaΓ γ&…

算法套路二:相向双指针

算法套路二:相向双指针 算法套路示例讲解&#xff1a;LeetCode167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是…

如何在MacOS上卸载IPGuard的软件--LAgent/LSDhelper程序

IPGuard类的软件一般企业用于办公设备监控&#xff0c;获取员工在设备上操作的信息&#xff0c;同时对文件等信息加密&#xff0c;用于防止企业信息外泄到网络上。但是设备上安装了此类软件一般不容易卸载掉&#xff0c;针对在macos上卸载过程作下讲解。 1. 一般服务类的程序都…

shell文件通配符:任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

文章目录一. 有哪些文件通配符二. 匹配任意?&#xff1a;匹配任意一个字符*&#xff1a;匹配任意数量的字符串三. 匹配任意指定一个字符1. []&#xff1a;匹配任意包含匹配任意包含字符范围2. [!]与[^]&#xff1a;匹配任意不包含四. 注意事项1. 通配符组合2. 不能跨越目录层级…

运筹系列67:大规模TSP问题的EAX遗传算法

1. 算法介绍 EAX是edge assembly crossover 算子的缩写。本算法有Y nagata教授公布&#xff0c;目前在VLSI最大的几个案例上获得了best的成绩。另外目前MonoLisa 100K问题的最优解也是由其公布&#xff0c;若能得到更优解&#xff0c;可以获得1000美元奖励。 算法步骤如下&…

【教学典型案例】用户称为设计者的正例

目录一&#xff1a;背景介绍二&#xff1a;设计理念三&#xff1a;设计过程按照设计理念设计的功能&#xff1a;1、用户可以根据自己的情况来选择显示哪些活动参与数据。2、用户可以对请假功能和点读功能进行开启和关闭操作&#xff08;默认为全部开启&#xff09;四&#xff1…

我一个女孩子居然做了十年硬件……

2011年&#xff0c;一个三本大学的电子信息专业的大三女学生跟2个通信专业的大二男生组成了一组代表学校参加2011年“瑞萨杯”全国大学生电子设计大赛&#xff0c;很意外的获得了湖北赛区省三等奖&#xff0c;虽然很意外&#xff0c;但还是挺高兴的&#xff0c;毕竟第一次为喜欢…

数据大爆炸时代,大容量硬盘为何不可或缺?

2月27日&#xff0c;中共中央、国务院正式印发《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;&#xff0c;明确提出要夯实数字中国建设基础&#xff1a;一是打通数字基础设施大动脉&#xff0c;优化各种级别数据中心的合理梯次布局&#xff1b;二是畅通…