CGAL 2D триангуляция Делоне: как получить ребра как пары идентификаторов вершин - PullRequest
7 голосов
/ 13 марта 2012

У меня есть набор 2D точек, каждая из которых связана с идентификатором.(например, если точки хранятся в массиве, id - это индекс каждой точки 0, ...., n-1).

Теперь я создаю триангуляцию Делоне для этих точек и хочу перечислитьвниз все конечные края.Для каждого ребра я хотел бы иметь идентификаторы точек, представленные соответствующими 2 вершинами.Пример: если между точкой 0 и точкой 2 есть грань, то (0,2).Это возможно?

#include <vector>
#include <CGAL\Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL\Delaunay_triangulation_2.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_2<K> Delaunay;
typedef K::Point_2 Point;

 void load_points(std::vector<Point>& rPoints)
 {
  rPoints.push_back(Point(10,10));   // first point
  rPoints.push_back(Point(60,10));   // second point
  rPoints.push_back(Point(30,40));   // third point
  rPoints.push_back(Point(40,80));   // fourth point
 }

void main()
{
 std::vector<Point> points;
 load_points(points);

 Delaunay dt;
 dt.insert(points.begin(),points.end());

 for(Delaunay::Finite_edges_iterator it = dt.finite_edges_begin(); it != dt.finite_edges_end(); ++it)
 {
     }
}

1 Ответ

10 голосов
/ 19 марта 2012

Сначала вам нужно использовать тип вершины с информацией, как в в этих примерах . Тогда ребро - это пара, содержащая дескриптор грани, а также индекс вершины грани, противоположной ребру.

если у вас есть:

Delaunay::Edge e=*it;

индексы, которые вы ищете:

int i1= e.first->vertex( (e.second+1)%3 )->info();
int i2= e.first->vertex( (e.second+2)%3 )->info();
...