c-使用我自己的Point类自定义CGAL内核

我想将自定义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);

解决方法:

更改内核非常棘手.从三角剖分类来看,与内核相比,唯一发生变化的是从其派生的点类型.对于谓词函子,这可能已经足够好了,但对于构​​造函子,如CDT所需的交集,就不够了.

我认为您有两种选择:

>为您的类型编写ConstrainedTriangulationTraits_2的完整特征接口.
>使用应该执行所需功能的Extensible Kernel机制.

上一篇:leetCode222:完全二叉树的节点个数


下一篇:CGAL资源库QGLViewer配置问题