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?

È stato utile?

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

  1. legge la riga di comando
  2. a seconda delle opzioni, crea una Triangolazione o un Delaunay_triangulation sul mucchio
  3. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top