Настройка ядра CGAL с помощью моего собственного класса Point - PullRequest
1 голос
/ 10 марта 2010

Я хотел бы использовать пользовательский класс Point с триангуляцией Делоне с ограничением CGAL. Однако со следующим классом MyPoint (который должен вести себя так же, как CGAL :: Point_2 no?) Я получаю ошибки сегментации. Это прекрасно работает, если я устанавливаю определение типа Point_2 внутри MyKernel в 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);

1 Ответ

1 голос
/ 20 ноября 2012

Сменить ядро ​​сложно. Здесь происходит то, что, как видно из класса триангуляции, единственное, что изменяется по сравнению с ядром, это тип точек, производный от него. Это может быть достаточно для функторов предикатов, но не для функторов конструкций, таких как пересечение, требуемое CDT.

Я думаю, у вас есть два варианта:

  1. Напишите полный интерфейс свойств для ConstrainedTriangulationTraits_2 для ваших типов.

  2. Используйте механизм Extensible Kernel , который должен делать то, что вы хотите.

...