C ++ ConvexHull点算法(及其索引)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ ConvexHull点算法(及其索引)相关的知识,希望对你有一定的参考价值。

我需要实现一个计算点的ConvexHull并返回索引的C ++代码,我找不到在C ++中做到这一点的方法?

在Matlab和Python中,非常简单,您只需要将点数组传递给ConvexHull函数,它就会返回索引;我们在C ++中有等效的东西吗?

答案

我需要获取C ++中点云的凸包索引,并且PCL或Boost提供的函数不返回点索引这一事实也使人恼火。您说对了,QHull文档似乎很复杂。所以我去看了PCL source codes并自己提取了它。这是我得到的

extern "C"
{
    #include <qhull/qhull.h>
}

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud; // some point cloud
int dimension = 2, size = cloud->size();
coordT* points = reinterpret_cast<coordT*> (calloc (size*dimension, sizeof(coordT)));
for (size_t i=0; i<size; ++i)
{
    points[2*i] = static_cast<coordT> (cloud->points[i].x);
    points[2*i+1] = static_cast<coordT> (cloud->points[i].y);
}
int exitcode = qh_new_qhull(dimension, size, points, true, const_cast<char*> ("qhull FA"), NULL, NULL);
if (exitcode != 0 || qh num_vertices == 0)
{
    std::cerr << "ERROR: qhull was unable to compute a convex hull for the given point cloud" << std::endl;
}
pcl::PointIndices::Ptr hull_indices (new pcl::PointIndices());
vertexT * vertex;
FORALLvertices
{
    hull_indices->indices.push_back(qh_pointid(vertex->point));
}
qh_freeqhull(!qh_ALL);
int curlong, totlong;
qh_memfreeshort(&curlong, &totlong);

请注意,这适用于2D点云。对于其他维度或数据类型,您可以进行相应的修改。希望能有所帮助!

另一答案

QHull是凸包,Delaunay三角剖分和好友的事实上的标准。 QHull提供了多种语言和界面-以及指向一些很好的参考文献的页面链接。

以上是关于C ++ ConvexHull点算法(及其索引)的主要内容,如果未能解决你的问题,请参考以下文章

[OpenCV] Samples 05: convexhull

[算法课][分治]寻找凸包 (Convex Hull)

opencv —— convexHull 寻找并绘制凸包

Python OpenCV - ConvexHull 错误“点不是 numpy 数组,也不是标量”?

分块查找的思及其查找效率分析(C语言)

凸包算法