2016-11-17 26 views
1

既存のアプリケーションをC#からC++/Qtに変換しようとしています。既存のコードは、MIConvexHullライブラリを使用して、3次元空間内の点集合の凸包を計算しています。 Faces関数を使用して面のリストを取得し、それらをループして各面の個々の頂点を取得します。私はこれをCGALライブラリで行いたいと思いますが、これを行うには明らかな方法はないようです。 convex_hull_3関数を使って凸包を作成しますが、そこからは何をすべきか分かりません。CGAL Convex Hull(Qt付き)

結果の多面体オブジェクトのファセットを反復処理する必要があります。各ファセットに対して、頂点を繰り返し処理する必要があります。各頂点について、QVector3Dオブジェクトを形成するためにx、y、z座標を抽出する必要があります。

ここには、既存の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; 
} 
関連する問題