2010-03-10 45 views
1

我想在CGAL約束delaunay三角測量中使用自定義Point類。但是,使用以下MyPoint類(它應該與CGAL :: Point_2的行爲完全相同),我會遇到分段錯誤。如果我將MyKernel中的Point_2 typedef設置爲CGAL :: Exact_predicates_inexact_constructions_kernel :: Point_2,它將完美工作。我究竟做錯了什麼?它出現segfaults在最後一行用我自己的Point類自定義CGAL內核

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); 

回答

1

是棘手的。這裏發生的事情是,從三角測量類看,與內核相比,唯一改變的是點類型,通過派生它。對於謂詞函子,這可能是足夠好的,但對於構​​造函子不適用,比如CDT所需的交集。

我認爲你有兩個選擇:

  1. 寫出ConstrainedTriangulationTraits_2您的類型充分性狀接口。

  2. 使用Extensible Kernel機制應該做你想做的。