Я имею дело с облаком точек, т.е. вектором точек, в результате вычисления, который содержит повторяющиеся точки (до 10% от размера облака).
Моя реализация заключалась в том, чтобы отсортировать эти точки в соответствии с значениями x, y и z, а затем использовать функцию std::unique
. Получающееся облако, тем не менее, все еще содержит дубликаты, даже если сама сортировка работает.
Здесь ключевой код
bool comparePoint(pcl::PointXYZINormal p1, pcl::PointXYZINormal p2){
if (p1.x != p2.x)
return p1.x > p2.x;
else if (p1.y != p2.y)
return p1.y > p2.y;
else
return p1.z > p2.z;
}
bool equalPoint(pcl::PointXYZINormal p1, pcl::PointXYZINormal p2){
if (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z)
return true;
return false;
}
void KDsearch::cullDuplePoints(){
std::sort(points.begin(), points.end(), comparePoint);
std::unique(points.begin(), points.end(), equalPoint);
}
И вот частичное извлечение выходных точек (координаты x, y и z):
1.96828 -535.09515 2794.8391
1.96627 -636.95264 2914.0366
1.96627 -636.95264 2914.0366
1.9651 108.77433 2350.9841
1.9651 108.77433 2350.9841
1.9642299 -206.19427 5618.4629
1.9642299 -206.19427 5618.4629
1.96386 -1880.3784 1346.0654
Так уникален ли он не работает должным образом или есть ошибка в моем равном состоянии?
Сами точки также содержат нормальные координаты, но они не важны для отбраковки, поэтому я не использовал их в коде.