我正在尝试将现有的应用程序从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库这样做感到茫然。我已经阅读了相当多的文档,但它似乎假设你已经拥有计算几何的研究生水平知识,但我没有。任何指向我正确方向的事情都将受到赞赏
答案 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;
}