2011-01-29 6 views
8

У меня довольно сложно получить vertex_handle для каждой из конечных точек ребра в триангуляции Delaunay. Так как я забил голову против этого в течение нескольких часов, я думал, что, может быть, один из вас, ребята могли бы мне помочь с этим, по-видимому тривиальной проблемой:Получение vertex_handle от 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(); 
    } 
} 

Согласно документации разыменования в Edge_iterator я должен получить Edge_handle и Edge_handle должны иметь члены source() и target(), чтобы просто получить конечные точки, но он не будет компилироваться и, кажется, ошибочен. Derefencing, как и выше, даст мне пару <>, которая не имеет этих функций-членов.

Любая идея, что я делаю неправильно?

+0

Куда компиляция не работает? – payne

+0

Это то, что (ei *) имеет пару типа, у которого явно нет источника(). – cdecker

ответ

9

Вывод оговорки Edge_iterator предоставит вам Edge в соответствии с кодом documentation.

Edge является definded следующим образом: typedef std::pair<Face_handle,int> Edge;

разыменовании Face_handle даст вам Face.

две вершины, которые есть края может быть доступен:

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

Я не знаю, если это полезно для вас квест, но доступ к точкам, как это:

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

Документация CGAL меня смущает ... Мне любопытно, где вы нашли звонки eh->source() и eh->target(), я не смог найти их :-)

+0

Это должно быть обработкой, а не вершинами в вашем первом решении 'Vertex_handle vs' и' Vertex_handle vt'. – rytis