使用我自己的Point类自定义CGAL内核 [英] Customizing CGAL Kernel with my own Point class
问题描述
我想在CGAL约束的delaunay三角剖分中使用自定义Point类。但是,使用以下MyPoint类(其行为应与CGAL :: Point_2否完全相同?),我遇到了分段错误。如果将MyKernel中的Point_2 typedef设置为CGAL :: Exact_predicates_inexact_constructions_kernel :: Point_2,它会完美地工作。我在做什么错?
I would like to use a custom Point class with the CGAL constrained delaunay triangulation. However, with the following MyPoint class (which should behave the exact same as a CGAL::Point_2 no?) I get segmentation faults. It works perfectly if I set the Point_2 typedef inside MyKernel to CGAL::Exact_predicates_inexact_constructions_kernel::Point_2. What am I doing wrong?
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;
在最后一行出现段错误的代码:
Code which segfaults at last line:
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所需的交集,就不够了。
Changing the kernel is tricky. What happens here is that, seen from the triangulation class, the only thing that changes compared to the kernel is the point type, by deriving from it. This can be good enough for predicates functors, but not for constructions functors, like the intersection that is required by the CDT.
我认为您有两个选择:
-
编写 ConstrainedTriangulationTraits_2 为您的类型。
使用可扩展内核机制,该机制应该可以实现您想要的功能。
Use the Extensible Kernel mechanism that is supposed to do what you want.
这篇关于使用我自己的Point类自定义CGAL内核的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!