2016-11-17 166 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; 
}