从边迭代器获取顶点句柄

11

我在获取Delaunay三角剖分中每条边的两个端点的顶点句柄上遇到了一些困难。由于我已经花费了几个小时的时间,还没有找到解决方法,因此我认为也许你们中的某个人可以帮助我解决这个看似微不足道的问题:

#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()来简单获取端点,但是编译无法通过,似乎是错误的。像上面那样解引用将给我一个没有这些成员函数的pair<>。你有什么想法吗?

编译失败在哪里? - payne
它是一个类型为pair的对象,很明显是没有source()函数的。 - cdecker
1个回答

12
文档中得知,对于一个Edge_iterator,解引用操作会返回一个EdgeEdge被定义为: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()函数调用,我找不到它们:-)


你的第一个解决方案中应该使用handles而不是vertices,即Vertex_handle vsVertex_handle vt - rytis
与此有些相关的是:获取Edge_iterator相邻面的最直接方法是对其进行解引用,然后解引用Face_handle以获取一个面,然后找到边的索引,最后使用neighbor(index)获取它?编辑:刚刚发现mirror_edge,这使得这个过程变得更容易了。 - lucidbrot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接