我有受约束的delaunay三角测量的Cdt。我需要获得边缘边缘,这应该是微不足道的:边缘只有一个面,但我不知道如何在CGAL中获得这些:
for(Cdt::Finite_edges_iterator eit = cdt.finite_edges_begin(); eit != cdt.finite_edges_end(); ++eit)
{
CD_Cdt::Edge ed = *eit;
???
}
另外一件事,使用 is_constrained()是没用的,因为我之前已经删除了一些面孔。
========编辑========
user3146587的答案确实有效,但由于我删除了一些面孔,我无法再检测到边框:
std::vector<CDT::Face_handle> invalid_fhs;
// ... add faces to invalid_fhs
// I delete all face handles in invalid_fhs
for(int a = invalid_fhs.size() - 1; a >= 0; a--)
{ cdt.delete_face(invalid_fhs[a]); }
答案 0 :(得分:2)
只需检查边缘是否与无限面相邻。如果是这样,那么它就是边界边缘。提醒:边缘是与边缘相邻的面的一对手柄,另一个相邻面的索引作为第一个面的邻居。
for (CDT::Finite_edges_iterator eit = cdt.finite_edges_begin(); eit != cdt.finite_edges_end(); ++eit)
{
const CDT::Face_handle& fh = eit->first;
if (cdt.is_infinite(fh) || cdt.is_infinite(fh->neighbor(eit->second)))
{
// Border edge
}
}
答案 1 :(得分:1)
好的,我明白了,
我发现了自己的错误:删除脸部是非常非常糟糕的事情。因为它使cdt无效并且弄乱了所有东西。
所以我做了什么:
(1)我只是将它们标记为在域外:
,而不是删除面孔。fit->set_marked(false);
(2)边框边缘有一个面在域中,另一个面不在:
for (Cdt::Finite_edges_iterator eit = cdt.finite_edges_begin(); eit != cdt.finite_edges_end(); ++eit)
{
const Cdt::Face_handle& fh = eit->first;
int ctr = 0;
if(fh->is_in_domain())
{
ctr++;
}
if(fh->neighbor(eit->second)->is_in_domain())
{
ctr++;
}
if(ctr == 1)
{
Cdt::Segment s = cd_cdt.segment(eit);
// yeah, I get my border !!
}
}