Pregunta

¿Cómo puedo utilizar una clase hereditaria de una triangulación en el contexto de una triangulación en CGAL?

Básicamente tengo el siguiente código:

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

Bueno, por supuesto, Delaunay_triangulation_2 hereda de Triangulation_2

Así que, cuando yo haga este código, la vinculación se realiza contra la clase Triangulation_2, en otras palabras, no se ejecuta una triangulación de Delaunay, sino que ejecuta una triangulación normal (la ejecución de los métodos de la clase padre en lugar de los métodos de niño) .

Creo que esto se debe a que el método de inserción de Triangulation_2 no se declara como virtual, de modo redefiniciones no funcionarán.

¿Sabe usted una forma de evitar esto? Tal vez el uso de Constrained_triangulation_2 y Constrained_delaunay_triangulation_2? (Esas clases definen algunos métodos virtuales, pero he leído el código fuente y no creo que se pueden utilizar sin añadir las limitaciones explícitas)

¿Alguna idea?

¿Fue útil?

Solución

Tras revisar su programa, sería necesario volver a formatear un poco, para que se ajuste al modelo de programación genérica. Permítanme recordar lo que hace el código (la que está disponible en github ):

  1. lee la línea de comandos
  2. dependiendo de las opciones, ya sea una instancia de una triangulación o una Delaunay_triangulation en el montón
  3. utiliza este objeto para algún procesamiento, suponiendo que los métodos son virtual (pero no son)

Una solución para su problema sería poner el paso 3 en un método separado, con el tipo de triangulación como parámetro de plantilla. Algo así como (utilizo sus tipos y nombres):

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

A continuación, en su función principal, que daría lugar a la utilización de Delaunay o triangulaciones de Delaunay no de la manera siguiente:

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

Otros consejos

¿Seguro de estas funciones son virtuales? Sin ellos están definiendo virtuales el compilador no llamar a las funciones derivadas de la clase.

A partir de una mirada superficial a las cabeceras CGAL no parece que estas clases tienen ninguna función virtuales en absoluto.

CGAL utiliza la programación genérica, no funciones virtuales. Se asemeja a STL, sólo el dominio es un poco más difícil, y hay que confiar más en los algoritmos que se suele hacer con STL.

No se puede decir, ¿cuál es la respuesta a su problema, debido a que ya ha proporcionado sólo un pequeño fragmento de código, pero trata de reemplazar

Triangle *t = new Delaunay;

con

Triangulation *t = new Delaunay;

primero. Si esto no ayuda, por favor, añadir más detalles a partir de sus definiciones de tipo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top