Question

Comment puis-je utiliser une classe héritée d'une triangulation dans le contexte d'une triangulation dans CGAL?

En fait je le code suivant:

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));

Eh bien, bien sûr, Delaunay_triangulation_2 hérite de Triangulation_2

Alors, quand j'exécute ce code, la liaison se fait contre la classe Triangulation_2, autrement dit, il n'exécute pas une triangulation de Delaunay, au lieu qu'il exécute une triangulation normale (exécution des méthodes de la classe mère au lieu des méthodes de l'enfant) .

Je pense que cela est parce que la méthode d'insertion de Triangulation_2 n'est pas déclarée comme virtuelle si redéfinitions ne fonctionnera pas.

Connaissez-vous un moyen de contourner cela? Peut-être en utilisant Constrained_triangulation_2 et Constrained_delaunay_triangulation_2? (Ces classes définissent des méthodes virtuelles, mais j'ai lu le code source et je ne pense pas qu'ils peuvent être utilisés sans ajouter les contraintes explicites)

Toutes les idées?

Était-ce utile?

La solution

J'ai vérifié votre programme, vous devez reformater un peu, de sorte qu'il correspond au modèle de programmation générique. Permettez-moi de rappeler ce que votre code fait (celui qui est disponible à github ):

  1. lit la ligne de commande
  2. en fonction des options, soit un instancie Triangulation ou Delaunay_triangulation sur le tas
  3. utilise cet objet pour un traitement, en supposant que les méthodes sont virtuelles (mais ils ne sont pas)

Une solution pour votre problème serait de mettre l'étape 3 dans une méthode distincte, avec le type de triangulation en tant que paramètre de modèle. Quelque chose comme (j'utilise vos types et noms):

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

Ensuite, dans votre fonction principale, vous déclencherait l'utilisation de Delaunay ou triangulations non-Delaunay de la manière suivante:

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

Autres conseils

Êtes-vous sûr que ces fonctions sont virtuelles? Sans eux étant le compilateur virtuel défini ne sera pas appeler les fonctions de classe dérivée.

D'un coup d'œil sur les en-têtes CGAL il ne semble pas que ces classes ont des fonctions virtuelles du tout.

CGAL utilise la programmation générique, pas de fonctions virtuelles. Il ressemble à STL, tout le domaine est un peu plus difficile, et vous devez compter davantage sur des algorithmes que l'on fait habituellement avec STL.

Je ne peux pas dire vraiment, quelle est la réponse à votre problème, parce que vous avez fourni juste un petit bout de code, mais essayez de remplacer

Triangle *t = new Delaunay;

avec

Triangulation *t = new Delaunay;

d'abord. Si cela ne fonctionne pas, s'il vous plaît ajouter plus de détails à partir de vos définitions de type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top