C++ 如何从CGAL中的Edge_迭代器中获取源点和目标点

C++ 如何从CGAL中的Edge_迭代器中获取源点和目标点,c++,compiler-errors,cgal,C++,Compiler Errors,Cgal,我在一些点上有一个Delaunay三角剖分,并希望以长度升序在其中的所有边上迭代,以构建最小跨度线程 我尝试了以下方法,但无法将其编译: typedef CGAL::Exact_predicates_inexact_constructions_kernel K; typedef CGAL::Delaunay_triangulation_2<K> T; typedef K::Point_2 P; typedef T::Vertex_handle Vh; typedef T::Verte

我在一些点上有一个Delaunay三角剖分,并希望以长度升序在其中的所有边上迭代,以构建最小跨度线程

我尝试了以下方法,但无法将其编译:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_2<K> T;
typedef K::Point_2 P;
typedef T::Vertex_handle Vh;
typedef T::Vertex_iterator Vi;
typedef T::Edge_iterator Ei;

bool sortFunction (Ei a, Ei b) {
    K::FT la, lb;
    la = CGAL::squared_distance(a.source().point(), a.target().point());
    lb = CGAL::squared_distance(b.source().point(), b.target().point());
    return la < lb;
}

...
T g;
...
std::vector<Ei> edges;
for (Ei ei = g.edges_begin(); ei != g.edges_end(); ei++) {
    edges.push_back(ei);
}
std::sort(edges.begin(), edges.end(), sortFunction);
...
typedef CGAL::精确谓词\不精确构造\内核K;
typedef CGAL::Delaunay_三角剖分_2 T;
类型定义K::点2 P;
typedef T::Vertex_手柄Vh;
typedef T::顶点迭代器Vi;
typedef T::Edge_迭代器Ei;
布尔排序函数(Ei a、Ei b){
K::FT-la,lb;
la=CGAL::平方距离(a.source().point(),a.target().point());
lb=CGAL::平方距离(b.源().点(),b.目标().点());
返回la
编译在
sortFunction
中失败,表示
source
不是
Edge\u迭代器的成员。然而,这里的文档让我感到困惑

表示边迭代器的值类型是半边。 据说我可以使用
source()
target()
访问这些点


然而,情况似乎并非如此。我搞砸了什么?

迭代器的作用应该有点像指向实际元素的指针,因此您需要在访问任何成员之前取消对它的引用。尝试将其更改为
a->source().point()

编辑:我猜句柄也是指针式的。看看它是否喜欢这个

la = CGAL::squared_distance(a->source()->point(), a->target()->point());
lb = CGAL::squared_distance(b->source()->point(), b->target()->point());

edge\u迭代器是面和顶点索引的
std::pair
。可以通过此面参照访问边的源顶点和目标顶点。边迭代器中的顶点索引符合相反的顶点。因此,另外两个具有id的
(i+2)%3
(i+1)%3


另一种解决方案是通过
三角剖分.section(edge\u迭代器)
获得线段,然后使用
source()
target()
函数直接到达点。但是,您无法通过这种方式访问顶点句柄。

您可以通过以下方式访问端点的顶点句柄:

T::Vertex_handle sVertex=a->first->Vertex(T::cw(a->second))

T::Vertex_handle fVertex=a->first->Vertex(T::ccw(a->second))

等等。。从每个顶点_控制柄,可以使用点方法恢复点的坐标


希望对您有所帮助

@Etan啊,源码返回一个顶点句柄,句柄也是指针式的。我将编辑我的答案以反映这一点。“没有名为
源代码的成员”
Triangulation::Edge e;
//TODO: get e
Triangulation::Vertex_handle v1 = e.first->vertex((e.second + 1) % 3);
Triangulation::Vertex_handle v2 = e.first->vertex((e.second + 2) % 3);
K::FT squared_distance = CGAL::squared_distance(v1->point(), v2->point());