繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM