2011-01-29 15 views
8

Mam dość trudności z uzyskaniem vertex_handle dla każdego z końcowych punktów krawędzi w triangulacji Delaunay. Ponieważ ja młotkiem głowę przed tym przez kilka godzin Myślałem, że może ktoś z was może mi pomóc z tym pozornie błahego problemu:Uzyskiwanie polecenia vertex_handle od argumentu 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(); 
    } 
} 

Zgodnie z dokumentacją dereferencing się Edge_iterator powinienem dostać Edge_handle i Edge_handle powinny mieć członkowie source() i target(), aby po prostu uzyskać punkty końcowe, ale nie będą się kompilować i wydają się błędne. Derefencing jak wyżej da mi parę <> która nie ma tych funkcji członka.

Każdy pomysł, co robię źle?

+0

Gdzie kompilacja się nie udała? – payne

+0

Jest to, że (ei *) jest typu pary, która oczywiście nie ma źródła(). – cdecker

Odpowiedz

9

Dereferencja pod numerem Edge_iterator da Ci Edge zgodnie z documentation.

Edge jest definiowany następująco: typedef std::pair<Face_handle,int> Edge;

dereferencja Face_handle daje Face.

dwóch wierzchołków, które łączy krawędź można uzyskać przez:

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

ja nie wiem, czy jest to pomocne dla Ciebie poszukiwań, ale jest dostęp do punktów tak:

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

Dokumentacja CGAL jest myląca ... Ciekaw jestem, gdzie znalazłeś wywołania eh->source() i eh->target(), nie mogłem go znaleźć :-)

+0

Powinny to być uchwyty zamiast wierzchołków w twoim pierwszym rozwiązaniu 'Vertex_handle vs' i' Vertex_handle vt'. – rytis

Powiązane problemy