Domanda
Come posso utilizzare una classe ereditata di una triangolazione, nel contesto di una triangolazione CGAL?
In pratica ho il seguente codice:
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));
Beh, certo, Delaunay_triangulation_2 eredita da Triangulation_2
Così, quando eseguo questo codice, il collegamento è fatto contro il Triangulation_2 classe, in altre parole, non esegue una triangolazione di delaunay, invece esegue un normale livello (l'esecuzione del genitore metodi della classe invece del figlio metodi).
Penso che questo è perché il metodo di inserimento di Triangulation_2 non è dichiarato come virtuale, in modo ridefinizioni non funziona.
Conoscete un modo per aggirare questo?Forse usando Constrained_triangulation_2 e Constrained_delaunay_triangulation_2?(quelle classi di definire alcuni metodi virtuali, ma ho letto il codice sorgente e non credo che essi possono essere utilizzati senza l'aggiunta di vincoli espliciti)
Tutte le idee?
Soluzione
Ho controllato il programma, è necessario riformattare un po', in modo che si adatti il generico modello di programmazione.Permettetemi di ricordare che cosa il vostro codice (quello disponibile github):
- legge la riga di comando
- a seconda delle opzioni, crea una Triangolazione o un Delaunay_triangulation sul mucchio
- utilizza questo oggetto per alcune lavorazioni, supponendo che i metodi virtuali (ma non sono)
Una soluzione per il vostro problema potrebbe essere quello di inserire la fase 3 in un metodo separato, con la triangolazione tipo di parametro del modello.Qualcosa di simile (io uso il tipo e nome):
template < class Triangulation >
void compute_mesh(int n_vertices, int max_x, int max_y)
{
Triangulation t;
// DO WHATEVER YOU WANT WITH t
}
Quindi, nella funzione principale, si potrebbe innescare l'uso di Delaunay o non triangolazioni di Delaunay nel seguente modo:
if (triang_type == 'D')
compute_mesh<Delaunay>(n_vertices, max_x, max_y);
else
compute_mesh<Triangulation>(n_vertices, max_x, max_y);
Altri suggerimenti
Sei sicuro di queste funzioni sono virtuali? Senza di loro in fase di definizione virtuale il compilatore non richiamare le funzioni della classe derivata.
Da un rapido sguardo le intestazioni CGAL non sembra che queste classi hanno alcuna funzione virtuali a tutti.
CGAL utilizza programmazione generica, non funzioni virtuali. Assomiglia STL, solo il dominio è un po 'più difficile, ed è necessario fare maggiore affidamento su algoritmi di uno di solito fa con STL.
Non posso davvero dire, qual è la risposta al vostro problema, perché hai fornito solo un piccolo frammento di codice, ma provare a sostituire
Triangle *t = new Delaunay;
con
Triangulation *t = new Delaunay;
prima. Se non aiuta, si prega di aggiungere ulteriori dettagli dalle vostre definizioni del tipo.