无序点云排序
在实际开发过程中,往往会遇到对一群点云数据先进行某种方式排序,然后再作其他的算法处理,达到工程目的。例如,本文需要处理以下点云数据,在进行后续算法之前需要先对点云进行排序,三维点云数据根据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]);
}
打印结果:
排序功能实现,可以进行后处理了!!!