我对某些点进行了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()
来访问这些点。
然而,情况似乎并非如此。我在这里搞砸了什么?
答案 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_handleT :: 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());