2011-01-29 11 views
8

Tengo bastante dificultad para obtener un vertex_handle para cada uno de los puntos finales de un borde en una triangulación Delaunay. Desde que golpeé la cabeza contra esto durante varias horas pensé que tal vez uno de ustedes me podría ayudar con este problema aparentemente trivial:Obteniendo un vertex_handle desde un edge_iterator

#include <iostream> 

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h> 
#include <CGAL/Delaunay_triangulation_2.h> 

using namespace std; 

typedef CGAL::Exact_predicates_inexact_constructions_kernel K; 
typedef CGAL::Delaunay_triangulation_2<K> Triangulation; 
typedef Triangulation::Point Point; 
typedef Triangulation::Edge_iterator Edge_iterator; 
typedef Triangulation::Vertex_handle Vertex; 

int main(){ 
    Point p; 
    Triangulation t; 
    while(cin >> p) 
    t.insert(p); 

    // Iterate over edges 
    for(Edge_iterator ei=t.finite_edges_begin();ei!=t.finite_edges_end(); ei++){ 
    // Get a vertex from the edge 
    Vertex vs = ei->source(); 
    } 
} 

De acuerdo con la documentación dereferenciar una Edge_iterator que debería obtener un Edge_handle y Edge_handle deben tener miembros source() y target() para obtener simplemente los puntos finales, pero no se compilará y parece estar mal. Deredecing como el anterior me dará un par <> que no tiene esas funciones miembro.

¿Alguna idea de lo que estoy haciendo mal?

+0

¿Dónde está la compilación que falla? – payne

+0

Es que (ei *) es de tipo par que obviamente no tiene una fuente(). – cdecker

Respuesta

9

Desreferenciando un Edge_iterator le dará un Edge según el documentation.

Edge se definded de la siguiente manera: typedef std::pair<Face_handle,int> Edge;

Desreferenciar la Face_handle le dará un Face.

Los dos vértices que une el borde se puede acceder por:

for(Edge_iterator ei=t.finite_edges_begin();ei!=t.finite_edges_end(); ei++){ 
    // Get a vertex from the edge 
    Triangulation::Face& f = *(ei->first); 
    int i = ei->second; 
    Vertex vs = f.vertex(f.cw(i)); 
    Vertex vt = f.vertex(f.ccw(i)); 
    } 

No sé si es útil para usted búsqueda, pero es acceder a los puntos de la siguiente manera:

for (Edge_iterator it = m_tri.edges_begin(); it != m_tri.edges_end(); ++it) 
{ 
    Triangulation::Segment seg = m_tri.segment(*it); 

    Triangulation::Point p0 = seg.point(0); 
    Triangulation::Point p1 = seg.point(1); 
    // ... 
} 

La documentación de CGAL me resulta confusa ... Tengo curiosidad de dónde encontraste las llamadas eh->source() y eh->target(), no pude encontrarlo :-)

+0

Debe ser identificadores en lugar de vértices en su primera solución 'Vertex_handle vs' y' Vertex_handle vt'. – rytis

Cuestiones relacionadas