我想使用自定义Point类和CGAL约束delaunay三角剖分。但是,使用以下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);
答案 0 :(得分:1)
更改内核很棘手。这里发生的是,从三角测量类看,与内核相比,唯一改变的是点类型,通过它来源。这对于谓词仿函数来说已经足够了,但对于构造函数来说却不够,比如CDT所需的交集。
我认为你有两个选择:
为您的类型编写ConstrainedTriangulationTraits_2的完整特征界面。
使用应该做你想做的Extensible Kernel机制。