2011-01-29 7 views
8

Sto riscontrando alcune difficoltà nel trovare un vertex_handle per ciascuno dei punti finali di un bordo in una triangolazione di Delaunay. Da quando ho martellato la testa contro questo per diverse ore ho pensato che forse uno di voi ragazzi mi potrebbe aiutare con questo problema apparentemente banale:Ottenere un vertex_handle da 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(); 
    } 
} 

Secondo la documentazione dereferenziazione un Edge_iterator dovrei ottenere un Edge_handle e Edge_handle dovrebbero avere i membri source() e target() ottengono semplicemente gli endpoint, ma non si compilano e sembrano sbagliati. Derefencing come sopra mi darà una coppia <> che non ha quelle funzioni membro.

Qualche idea su cosa sto facendo male?

+0

Dove fallisce la compilazione? – payne

+0

È che (ei *) è di tipo coppia che ovviamente non ha una fonte(). – cdecker

risposta

9

Il dereferenziamento a Edge_iterator fornisce un Edge in base allo documentation.

Edge è definded come segue: typedef std::pair<Face_handle,int> Edge;

Dereferenziare il Face_handle vi darà un Face.

I due vertici che unisce il bordo si può accedere da:

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

Non so se è utile per voi quest, ma è accedere ai punti in questo modo:

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 documentazione CGAL mi confonde ... Sono curioso di sapere dove hai trovato le chiamate eh->source() e eh->target(), non riuscivo a trovarlo :-)

+0

Dovrebbe trattarsi di handle anziché di vertici nella prima soluzione 'Vertex_handle vs' e' Vertex_handle vt'. – rytis