无序点云排序

无序点云排序


在实际开发过程中,往往会遇到对一群点云数据先进行某种方式排序,然后再作其他的算法处理,达到工程目的。例如,本文需要处理以下点云数据,在进行后续算法之前需要先对点云进行排序,三维点云数据根据z轴数据从大到小排序。
在这里插入图片描述
考虑到后面算法过程当中会频繁插入新的点、频繁删除点的动作,选择了set作为存储结构
先随机生成点云数据

	vector<vec>pointsCloud;
	vec vp;
	for (int i=0;i<100;i++)
	{
		vp[0] = 1.024*(rand() % 60);
		vp[1] = 1.024*(rand() % 60);
		vp[2] =100+ 1.024*(rand() % 60);
		pointsCloud.push_back(vp);
	}

系统默认的排序功能只能对基础类型进行排序,对于自定义的三维点数据类vec是不使用的,要实现z轴从大到小排序功能,有两种思路:第一种:在vec类内部重载>操作符;第二种:重载()运算符;
第一种方法需要在vec类内部添加函数,实际开发过程中是不太建议的,因为通常我们都使用第三方库的数据结构,需要重载了运算符,需要更新库,如果其他人使用你的功能,需要都更新相关的文件;而第二种方式,是定义全局函数对象的方式实现,并不需要修改其他文件,所以使用起来比较简单,所以此时使用第二种方式。
搭建函数对象,本文先根据z轴排序,然后根据y轴,到x轴的排序方式,可自由搭配

	struct comp
	{
		bool operator()(vec left, vec  right)  //重载()运算符
		{
			if (left[2] > right[2])return true;
			else if (left[2] < right[2])return false;
			else if (left[1] > right[1])return true;
			else if (left[1] < right[1])return false;
			else if (left[0] > right[0])return true;
			else return false;
		}
	};

定义具有排序功能的set对象:

	set<vec,comp>orderCloud;

将随机点云插入set容器

	for (int i=0;i<pointCloud.size();i++)
	{
		orderCloud.insert(pointCloud[i]);
	}

打印结果:
在这里插入图片描述
排序功能实现,可以进行后处理了!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值