2

CGAL 制約付きドローネ三角形分割でカスタム Point クラスを使用したいと考えています。ただし、次の MyPoint クラス (CGAL::Point_2 とまったく同じように動作するはずです) では、セグメンテーション違反が発生します。MyKernel 内の Point_2 typedef を CGAL::Exact_predicates_inexact_constructions_kernel::Point_2 に設定すると、完全に機能します。私は何を間違っていますか?

template<class P>
struct MyPoint : public P {
    MyPoint() : P() {}
    MyPoint(const MyPoint& p) : P(p) {}

    MyPoint( int x, int y) : P(x,y) {}
    MyPoint( double x, double y) : P(x,y) {}
};

struct MyKernel : CGAL::Exact_predicates_inexact_constructions_kernel {
    typedef MyPoint<CGAL::Exact_predicates_inexact_constructions_kernel::Point_2> Point_2;
};

typedef MyKernel K;

typedef CGAL::Triangulation_vertex_base_2<K>                     Vb;
typedef CGAL::Constrained_triangulation_face_base_2<K>           Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb>              TDS;
typedef CGAL::Exact_predicates_tag                               Itag;
typedef CGAL::Constrained_Delaunay_triangulation_2<K, TDS, Itag> CDT;
typedef CDT::Point          Point;

最終行でセグメンテーション違反を起こすコード:

CDT cdt;
Point cgal_p1;
Point cgal_p2;
cgal_p1 = Point(p1[1],p1[2]);
cgal_p2 = Point(p2[1],p2[2]);
cdt.insert_constraint(cgal_p1,
                      cgal_p2);
4

1 に答える 1

2

カーネルの変更はトリッキーです。ここで何が起こるかというと、三角測量クラスから見て、カーネルと比較して変更されるのは、そこから派生することによるポイント タイプだけです。これは、述語ファンクターには十分ですが、CDT で必要とされる交差のような構造ファンクターには適していません。

2つのオプションがあると思います:

  1. タイプのConstrainedTriangulationTraits_2の完全な特性インターフェースを記述します。

  2. あなたが望むことをするはずのExtensible Kernelメカニズムを使用してください。

于 2012-11-20T05:33:09.353 に答える