如何在 CGAL 中去除"non-closing"边缘



我有一个CGAL排列图,看起来像这样:

,_____,  ,_____,   ,_____,
|     |  |     |   |     |
|--   |  |     |---|     |   ---
|_____|  |_____|   |_____|

我想去掉所有没有";关闭";一个多边形,类似于正方形内部的水平多边形,连接其他两个正方形的多边形,以及单独的边。

CGAL有办法做到这一点吗?此外,这种边在拓扑或图论中有名字吗?

基于@EfiFogel的回答和@HEKTO对HalfEdge::face()的突出显示,我编码了这个算法,该算法可以去除两侧具有相同面的每条边。我不知道是否有可能提高复杂性,但它可以很好地处理我的少量边缘。

它在C++中。

template <typename Arrangement>
void removeNonClosingEdges(Arrangement &arrangement)
{
using Halfedge_handle = typename Arrangement::Halfedge_handle;
std::vector<Halfedge_handle> uselessEdges;
for (auto edgeIt = arrangement.edges_begin(), edgeEnd = arrangement.edges_end();
edgeIt != edgeEnd;
++edgeIt)
{
Halfedge_handle he = edgeIt;
if (he->face() == he->twin()->face())
uselessEdges.push_back(he);
}
for (Halfedge_handle uselessHalfEdge : uselessEdges)
arrangement.remove_edge(uselessHalfEdge, false, false);
// Remove all isolated vertices
typename Arrangement::Vertex_iterator iter = arrangement.vertices_begin();
while (iter != arrangement.vertices_end())
{
// Keep an iterator to the next vertex, as curr might be deleted.
typename Arrangement::Vertex_iterator curr = iter++;
if (curr->is_isolated())
arrangement.remove_isolated_vertex(curr);
}
}

编辑:感谢@EfiFogel和@HEKTO ,使用更简单的方法

最新更新