如何从CGAL中的Edge_iterator获取源点和目标点

时间:2011-01-28 16:04:15

标签: 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::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);
...

编译在sortFunction中失败,说source不是Edge_iterator的成员。但是,文档让我感到困惑。

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

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

4 个答案:

答案 0 :(得分:4)

edge_iterator是面的std::pair和顶点索引。可以通过此面参考访问边的源顶点和目标顶点。 edge_iterator中的顶点索引符合相反的顶点。所以,其他两个人都有id (i+2)%3(i+1)%3

其他一些解决方案是通过triangulation.segment(edge_iterator)进入该细分受众群,然后使用source()target()函数直接转到这些点。但是,您无法以这种方式访问​​顶点句柄。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您可以通过

访问端点的vertex_handle

T :: Vertex_handle sVertex = a-&gt; first-&gt; vertex(T :: cw(a-&gt; second));

T :: Vertex_handle fVertex = a-&gt; first-&gt; vertex(T :: ccw(a-&gt; second));

等等..从每个Vertex_handle你可以使用点法恢复点的坐标..

希望它可以提供帮助

答案 3 :(得分:-1)

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

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

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