Вопрос

Как я могу использовать унаследованный класс триангуляции в контексте триангуляции в CGAL?

В принципе, у меня есть следующий код:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;

typedef CGAL::Triangulation_vertex_base_with_info_2<int,K> Vb;
typedef CGAL::Triangulation_face_base_with_info_2<int,K>   Fb;
typedef CGAL::Triangulation_data_structure_2<Vb,Fb>        Tds;
typedef CGAL::Delaunay_triangulation_2<K,Tds>              Delaunay;
typedef CGAL::Triangulation_2<K,Tds>                       Triangulation;

typedef Triangulation::Point Point;

...

Triangulation *t = new Delaunay;

...

// x and y are properly defined and instantiated
t->insert(Point(x,y));

Ну, конечно, Delaunay_triangulation_2 наследует от Triangulation_2

Итак, когда я выполняю этот код, связывание выполняется с классом Triangulation_2, другими словами, он не выполняет триангуляцию Делоне, вместо этого он выполняет обычную триангуляцию (выполняя методы родительского класса вместо дочерних методов).

Я думаю, это потому, что метод insert Triangulation_2 не объявлен как виртуальный, поэтому переопределения не будут работать.

Ты знаешь, как это обойти?Может быть, используя Constrained_triangulation_2 и Constrained_delaunay_triangulation_2?(эти классы определяют некоторые виртуальные методы, но я прочитал исходный код и не думаю, что их можно использовать без добавления явных ограничений)

Есть какие-нибудь идеи?

Это было полезно?

Решение

Я проверил вашу программу, вам нужно было бы немного ее переформатировать, чтобы она соответствовала общей модели программирования.Позвольте мне напомнить, что делает ваш код (тот, который доступен по адресу гитхаб):

  1. считывает командную строку
  2. в зависимости от параметров создает экземпляр либо Триангуляции, либо Delaunay_triangulation в куче
  3. использует этот объект для некоторой обработки, предполагая, что методы являются виртуальными (но это не так)

Решением вашей проблемы было бы выделить шаг 3 в отдельный метод с типом триангуляции в качестве параметра шаблона.Что-то вроде (я использую ваши типы и имена):

template < class Triangulation >
void compute_mesh(int n_vertices, int max_x, int max_y)
{
    Triangulation t;
    // DO WHATEVER YOU WANT WITH t
}

Затем, в вашей основной функции, вы должны инициировать использование триангуляций Делоне или не-Делоне следующим образом:

if (triang_type == 'D') 
    compute_mesh<Delaunay>(n_vertices, max_x, max_y);
else 
    compute_mesh<Triangulation>(n_vertices, max_x, max_y);

Другие советы

Вы уверены, что эти функции являются виртуальными?Без того, чтобы они были определены виртуальными, компилятор не будет вызывать функции производного класса.

При беглом взгляде на заголовки CGAL кажется, что эти классы вообще не имеют каких-либо виртуальных функций.

CGAL использует универсальное программирование, а не виртуальные функции.Это напоминает STL, только домен немного сложнее, и вам нужно больше полагаться на алгоритмы, чем обычно делается с STL.

Я не могу точно сказать, каков ответ на вашу проблему, потому что вы предоставили лишь небольшой фрагмент кода, но попробуйте заменить

Triangle *t = new Delaunay;

с

Triangulation *t = new Delaunay;

Первый.Если это не поможет, пожалуйста, добавьте больше деталей из ваших определений типов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top