2009-05-12 25 views
2

Comment utiliser une classe héritée d'une triangulation dans le contexte d'une triangulation dans CGAL?Héritage CGAL

Fondamentalement, 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 mise en relation se fait contre la classe Triangulation_2, dans d'autres mots, il n'exécute pas une triangulation delaunay, mais exécute une triangulation normale (en exécutant les méthodes de la classe parent au lieu des méthodes enfant).

Je pense que c'est parce que la méthode d'insertion de Triangulation_2 n'est pas déclarée comme virtuelle, donc les redéfinitions ne fonctionneront pas.

Connaissez-vous un moyen de contourner ce problème? Peut-être utiliser Constrained_triangulation_2 et Constrained_delaunay_triangulation_2? (ces classes définissent certaines méthodes virtuelles, mais j'ai lu le code source et je ne pense pas qu'elles puissent être utilisées sans ajouter les contraintes explicites)

Des idées?

Répondre

3

J'ai vérifié votre programme, vous auriez besoin de le reformater un peu, afin qu'il corresponde 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, instantie soit un Triangulation ou un Delaunay_triangulation sur le tas
  3. utilise cet objet pour un traitement, en supposant que les méthodes sont virtuelles (mais ils ne le sont pas)

Une solution pour votre problème serait de mettre l'étape 3 dans une méthode séparée, avec le type de triangulation comme 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); 
+0

Je ne suis pas connecté à StackOverflow depuis un moment. Merci, ça fait l'affaire. – Gaston

0

Etes-vous sûr que ces fonctions sont virtuelles? Sans qu'ils soient définis virtuels, le compilateur n'appellera pas les fonctions de classe dérivées. D'un coup d'œil sur les en-têtes CGAL, il ne semble pas que ces classes aient des fonctions virtuelles.

+0

C'est un peu ce que je dis, les classes Constrained_ * ont des méthodes virtuelles protégées (comme la méthode virtual_insert) mais, comme elles sont protégées, je ne peux pas les utiliser. – Gaston

0

Le CGAL utilise la programmation générique, pas les fonctions virtuelles. Il ressemble à STL, juste le domaine est un peu plus difficile, et vous devez compter sur plus d'algorithmes que ce qu'on fait habituellement avec STL.

Je ne peux pas vraiment dire, 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; 

premier. Si cela ne vous aide pas, veuillez ajouter plus de détails à partir de vos définitions de type.

+0

Salut, j'ai corrigé la variable de t, c'est ce que j'avais réellement dans mon code et ça ne marche pas. Vous pouvez voir le code complet sur http://github.com/gjorquera/triangle-mesh/blob/6eb7e304a486a1a3de47ac9264a322b5cf7bc4c1/main.cpp c'est assez simple. – Gaston