[英]How to get the source and target points from Edge_iterator in 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文档说边缘迭代器的值类型是半边形。 还有据说我可以使用source()
和target()
来访问点。
但是,情况似乎并非如此。 我在这里搞砸了什么?
edge_iterator
是一个std::pair
edge_iterator
和顶点索引。 可以通过此面参考访问边的源顶点和目标顶点。 edge_iterator中的顶点索引符合相反的顶点。 所以,其他两个有id (i+2)%3
和(i+1)%3
。
其他一些解决方案是通过triangulation.segment(edge_iterator)
进入该段,然后使用source()
和target()
函数直接到达这些点。 但是,您无法以这种方式访问顶点句柄。
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());
您可以通过访问端点的vertex_handle
T :: Vertex_handle sVertex = a-> first-> vertex(T :: cw(a-> second));
T :: Vertex_handle fVertex = a-> first-> vertex(T :: ccw(a-> second));
等等。从每个Vertex_handle中,您可以使用point方法恢复点的坐标。
希望它可以提供帮助
迭代器应该有点像指向实际元素的指针,因此在访问任何成员之前需要取消引用它。 尝试将其更改为a->source().point()
编辑:我猜句柄也像指针一样。 看看它是否喜欢这个。
la = CGAL::squared_distance(a->source()->point(), a->target()->point());
lb = CGAL::squared_distance(b->source()->point(), b->target()->point());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.