Frage

Wie kann ich eine vererbte Klasse einer Triangulation im Rahmen einer Triangulation in CGAL verwenden?

Im Grunde genommen habe ich den folgenden Code:

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

Nun, natürlich, Delaunay_triangulation_2 erbt von Triangulation_2

Also, wenn ich diesen Code ausführen, wird die Verknüpfung gegen die Klasse Triangulation_2 getan, mit anderen Worten, ist es nicht eine Delaunay-Triangulation führt, stattdessen führt er eine normale Triangulation (die Elternklasse Methoden anstelle der Kinder Methoden ausgeführt wird) .

Ich denke, das liegt daran, dass der Einsatz von Verfahren Triangulation_2 nicht als virtuelle deklariert ist so Neudefinitionen wird nicht funktionieren.

Sie wissen, einen Weg, um dieses? Vielleicht Constrained_triangulation_2 und Constrained_delaunay_triangulation_2 mit? (Diese Klassen definieren einige virtuelle Methoden, aber ich habe den Quellcode lesen, und ich glaube nicht, können sie ohne Zugabe der expliziten Einschränkungen verwendet werden)

Irgendwelche Ideen?

War es hilfreich?

Lösung

ich überprüfte das Programm, müssen Sie es ein bisschen neu zu formatieren, so dass es das allgemeine Programmiermodell paßt. Lassen Sie mich daran erinnern, was Ihr Code tut (die, verfügbar unter Github ):

  1. liest die Befehlszeile
  2. in Abhängigkeit von den Optionen, instanziiert entweder eine Triangulation oder ein Delaunay_triangulation auf dem Heap
  3. verwendet dieses Objekt für einige Verarbeitung unter der Annahme, dass die Methoden virtuell sind (aber sie sind nicht)

Eine Lösung für Ihr Problem Schritt zu setzen wäre 3 in einem separaten Verfahren, mit dem Triangulation Typ als Template-Parameter. So etwas wie (ich benutze Ihre Typen und Namen):

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

Dann in Ihrer Hauptfunktion, würden Sie die Verwendung von Delaunay oder Nicht-Delaunay-Triangulation in der folgenden Art und Weise auslösen:

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

Andere Tipps

Sind Sie sicher, dass diese Funktionen virtuell sind? Ohne sie der Compiler virtuelle definiert ist werden die abgeleiteten Klasse Funktionen nicht aufrufen.

Von einem flüchtigen Blick auf die CGAL Header es scheint nicht, dass diese Klassen überhaupt keine virtuellen Funktionen haben.

CGAL verwendet generische Programmierung, nicht virtuelle Funktionen. Es ähnelt STL, nur die Domäne ein wenig schwieriger ist, und Sie müssen mehr auf Algorithmen beruhen, als man in der Regel mit STL Fall ist.

Ich kann nicht wirklich sagen, was ist die Antwort auf Ihr Problem, weil Sie nur einen kleinen Ausschnitt aus dem Code zur Verfügung gestellt, sondern versuche, zu ersetzen

Triangle *t = new Delaunay;

mit

Triangulation *t = new Delaunay;

zuerst. Wenn es nicht hilft, bitte weitere Informationen von Ihrer Typdefinition hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top