qhull库-C++;接口 库(Que.org)在他的网站上有几个例子,但是关于C++的所有信息对我来说都不是很有用。

qhull库-C++;接口 库(Que.org)在他的网站上有几个例子,但是关于C++的所有信息对我来说都不是很有用。,c++,convex-hull,qhull,C++,Convex Hull,Qhull,我试图制作一个从文件中读取的3D点的简单凸包,我不能使用网站中建议的技术,将qhull.exe作为外部应用程序调用,因为我需要根据我在数据点中所做的一些修改制作几个凸包 我找不到一个简单的例子来做这件事,有人能给我一些帮助吗?任何信息都是有用的 谢谢< p>因为我用C++自己使用Qhull很困难,在Web上找不到有用的例子,所以DDDDD最终获得了有效的结果,我在这里发布我的代码以供将来使用。 这个答案适用于windows和visual studio 2012/3。我不知道它是如何在其他平台上工

我试图制作一个从文件中读取的3D点的简单凸包,我不能使用网站中建议的技术,将qhull.exe作为外部应用程序调用,因为我需要根据我在数据点中所做的一些修改制作几个凸包

我找不到一个简单的例子来做这件事,有人能给我一些帮助吗?任何信息都是有用的


谢谢

< p>因为我用C++自己使用Qhull很困难,在Web上找不到有用的例子,所以DDDDD最终获得了有效的结果,我在这里发布我的代码以供将来使用。 这个答案适用于windows和visual studio 2012/3。我不知道它是如何在其他平台上工作的

因此,首先,在从 在VS中打开项目时,只需添加以下2个目录:

libqhull/
libqhullcpp/
将这些文件添加到项目后,添加以下代码(这是我的方式,显然您可以使用自己的方式):

Qhull.h

namespace orgQhull{
//...
private:
    PointCoordinates *m_externalPoints;
//...
public:
    void runQhull3D(const std::vector<vec3> &points, const char* args);
    void runQhull(const PointCoordinates &points, const char *qhullCommand2);
//...
}
namespace-orgQhull{
//...
私人:
点坐标*m_外部点;
//...
公众:
void runQhull3D(常量标准::向量和点,常量字符*参数);
void runQhull(常量点坐标和点,常量字符*qhullCommand2);
//...
}
Qhull.cpp

void Qhull::runQhull3D(const std::vector<vec3> &points, const char* args)
{
    m_externalPoints = new PointCoordinates(3);  //3 = dimension
    vector<double> allPoints;
    for each (vec3 p in points)
    {
        allPoints.push_back(p.x());
        allPoints.push_back(p.y());
        allPoints.push_back(p.z());
    }

    m_externalPoints->append(allPoints); //convert to vector<double>
    runQhull(*m_externalPoints, args);
}

void Qhull::runQhull(const PointCoordinates &points, const char *qhullCommand2)
{
    runQhull(points.comment().c_str(), points.dimension(), points.count(), &*points.coordinates(), qhullCommand2);
}
void Qhull::runQhull3D(常量std::向量和点,常量char*args)
{
m_externalPoints=新点坐标(3);//3=尺寸
向量所有点;
对于每个(以点为单位的vec3 p)
{
所有点。向后推(p.x());
所有点。向后推(p.y());
所有点。向后推(p.z());
}
m_externalPoints->append(allPoints);//转换为向量
runQhull(*m_外部点,args);
}
void Qhull::runQhull(常量点坐标和点,常量字符*qhullCommand2)
{
runQhull(points.comment().c_str()、points.dimension()、points.count()、&*points.coordinates()、qhullCommand2);
}
最后,这是如何使用代码:

//not sure all these includes are needed
#include "RboxPoints.h"
#include "QhullError.h"
#include "Qhull.h"
#include "QhullQh.h"
#include "QhullFacet.h"
#include "QhullFacetList.h"
#include "QhullLinkedList.h"
#include "QhullVertex.h"
#include "QhullSet.h"
#include "QhullVertexSet.h"
#include <vector>

int main()
{
    orgQhull::Qhull qhull;
    std::vector<vec3> vertices;
    qhull.runQhull3D(vertices, "Qt");

    QhullFacetList facets = qhull.facetList();
    for (QhullFacetList::iterator it = facets.begin(); it != facets.end(); ++it)
    {
        if (!(*it).isGood()) continue;
        QhullFacet f = *it;
        QhullVertexSet vSet = f.vertices();
        for (QhullVertexSet::iterator vIt = vSet.begin(); vIt != vSet.end(); ++vIt)
        {
            QhullVertex v = *vIt;
            QhullPoint p = v.point();
            double * coords = p.coordinates();
            vec3 aPoint = vec3(coords[0], coords[1], coords[2]);
            // ...Do what ever you want
        }
    }

    // Another way to iterate (c++11), and the way the get the normals
    std::vector<std::pair<vec3, double> > facetsNormals;
    for each (QhullFacet facet in qhull.facetList().toStdVector())
    {
        if (facet.hyperplane().isDefined())
        {
            auto coord = facet.hyperplane().coordinates();
            vec3 normal(coord[0], coord[1], coord[2]);
            double offset = facet.hyperplane().offset();
            facetsNormals.push_back(std::pair<vec3, double>(normal, offset));
        }
    }
}
//不确定是否需要所有这些内容
#包括“RboxPoints.h”
#包括“QhullError.h”
#包括“Qhull.h”
#包括“QhullQh.h”
#包括“QhullFacet.h”
#包括“QhullFacetList.h”
#包括“qhullinkedlist.h”
#包括“QhullVertex.h”
#包括“QhullSet.h”
#包括“QhullVertexSet.h”
#包括
int main()
{
orgQhull::Qhull-Qhull;
向量顶点;
runQhull3D(顶点,“Qt”);
QhullFacetList facets=qhull.facetList();
对于(QhullFacetList::iterator it=facets.begin();it!=facets.end();+it)
{
如果(!(*it).isGood())继续;
QhullFacet f=*it;
QhullVertexSet vSet=f.顶点();
对于(QhullVertexSet::迭代器vIt=vSet.begin();vIt!=vSet.end();++vIt)
{
QhullVertex v=*vIt;
QhullPoint p=v.point();
双*坐标=p.坐标();
vec3 aPoint=vec3(坐标[0],坐标[1],坐标[2]);
//…你想干什么就干什么
}
}
//另一种迭代方法(c++11),以及获取法线的方法
std::向量刻面;
对于每个(qhull.facetList().toStdVector()中的QhullFacet方面)
{
if(facet.hyperplane().isDefined())
{
auto-coord=facet.hyperplane().coordinates();
vec3正态(coord[0],coord[1],coord[2]);
双偏移=facet.hyperplane().offset();
facetsNormals.push_back(标准::对(正常,偏移));
}
}
}

请注意,我从我的项目中复制了这段代码,并对其进行了一些修改,以便提供更多信息,但尚未编译此示例。

我使用的是windowsoh man,该库非常复杂。我只想查一串函数,它用来做凸包,它是。。。喜欢russian@Raaj谢谢你为其他人指出这一点。请随意用线程安全的代码编辑我的答案,我会检查并接受它,这里没有。我浏览了整个internet/github/codeproject的所有内容。没有C/C++的凸凹壳算法的例子。如果我没有错的话..qhull已经提出了这个新的可重入qhull,它是线程安全的。我没有发现任何使用codeqhull 2015的例子是可重入的,但不是线程安全的:请看,谢谢,这篇文章真的很有用。