CGAL Convex Hull,Qt

时间:2016-11-17 02:28:17

标签: qt cgal

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

我需要遍历生成的多面体对象的面。对于每个方面,我需要遍历顶点。对于每个顶点,我需要提取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库这样做感到茫然。我已经阅读了相当多的文档,但它似乎假设你已经拥有计算几何的研究生水平知识,但我没有。任何指向我正确方向的事情都将受到赞赏

1 个答案:

答案 0 :(得分: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;
}