我有一个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 ,使用更简单的方法