Получение vertex_handle от edge_iterator - PullRequest
9 голосов
/ 29 января 2011

У меня довольно большие трудности с получением ручки vertex_handle для каждой из конечных точек ребра в триангуляции Делоне.Поскольку я в течение нескольких часов бился головой об этом, я подумал, что, возможно, один из вас, ребята, сможет помочь мне с этой явно тривиальной проблемой:

#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 (), чтобы просто получить конечные точки, но он не будет компилироваться и, похоже, будет неправильным.Разблокировка, как указано выше, даст мне пару <>, у которой нет этих функций-членов.

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

1 Ответ

9 голосов
/ 29 января 2011

Разыменование Edge_iterator даст вам Edge в соответствии с документацией .

Edge определяется следующим образом: 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(), я не смог найти: -)

...