2016-11-17 169 views
1

我试图将现有的应用程序从C#转换为C++/Qt。现有的代码使用MIConvexHull库来计算三维空间中一组点的凸包。它使用Faces函数来获取面的列表,然后遍历它们以获取每个面的单个顶点。我想用CGAL库来做到这一点,但似乎没有一个明显的方法来做到这一点。使用convex_hull_ 3函数创建凸包,但从那里开始并不明显。CGAL凸包与Qt

我需要遍历生成的多面体对象的构面。对于每个方面,我需要遍历顶点。对于每个顶点,我需要提取x,y和z坐标,以形成一个QVector3D对象。

这是现有C#代码的代码片段。在这种情况下,baseContour是3D顶点列表。

var triangulationFaces = MIConvexHull.ConvexHull.Create(baseContour).Faces; 
var triangulationPoints = new List<Point3D>(); 
var triangulationIndices = new List<int>(); 
int i = 0; 
foreach (var f in triangulationFaces) 
{ 
    var x = f.Vertices.Select(p => new Point3D(p.Position[0], p.Position[1], p.Position[2])).ToList(); 
    triangulationPoints.AddRange(x); 
    triangulationIndices.Add(3 * i); 
    triangulationIndices.Add(3 * i + 1); 
    triangulationIndices.Add(3 * i + 2); 
    i++; 
} 

我不知道如何用CGAL库做到这一点。我已经阅读了相当多的文档,但似乎认为你已经拥有研究生级别的计算几何知识,但我没有。任何东西指向我在正确的方向,将不胜感激

回答

0

有一个example在用户手册。

我用它做你想要什么:

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Polyhedron_3.h> 
#include <CGAL/boost/graph/graph_traits_Polyhedron_3.h> 
#include <CGAL/Unique_hash_map.h> 
#include <CGAL/convex_hull_3.h> 
#include <vector> 
#include <fstream> 
#include <boost/foreach.hpp> 

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Polyhedron_3<K>      Polyhedron_3; 
typedef K::Point_3     Point_3; 

typedef boost::graph_traits<Polyhedron_3>::vertex_descriptor vertex_descriptor; 
typedef boost::graph_traits<Polyhedron_3>::face_descriptor face_descriptor; 

int main(int argc, char* argv[]) 
{ 
    // get the input points from a file 
    std::ifstream in(argv[1]); 
    std::vector<Point_3> points; 
    Point_3 p; 
    while(in >> p){ 
    points.push_back(p); 
    } 

    // define polyhedron to hold convex hull 
    Polyhedron_3 poly; 

    // compute convex hull of non-collinear points 
    CGAL::convex_hull_3(points.begin(), points.end(), poly); 

    std::cout << "The convex hull contains " 
      << num_vertices(poly) << " vertices" 
      << " and " << num_faces(poly) << " faces" << std::endl; 

    // A hash map that will associate an index to each vertex 
    CGAL::Unique_hash_map<vertex_descriptor,int> index; 

    int i = 0; 

    // In case your compiler supports C++11 you can replace 
    // use the next line instead of the line with BOOST_FOREACH 
    // for(vertex_descriptor vd : vertices(poly)){ 
    BOOST_FOREACH(vertex_descriptor vd, vertices(poly)){ 
    std::cout << vd->point() << std::endl; 
    index[vd]= i++; 
    } 

    // loop over the faces and for each face loop over the vertices 
    // Again you can replace with for(.. : ..) 
    BOOST_FOREACH(face_descriptor fd, faces(poly)){ 
    BOOST_FOREACH(vertex_descriptor vd, vertices_around_face(halfedge(fd,poly),poly)){ 
     std::cout << index[vd] << " "; 
    } 
    std::cout << std::endl; 
    } 
    return 0; 
}