删除一些面后如何获取边框边缘(CGAL)?

时间:2014-03-20 03:09:34

标签: graphics geometry cgal

我有受约束的delaunay三角测量的Cdt。我需要获得边缘边缘,这应该是微不足道的:边缘只有一个面,但我不知道如何在CGAL中获得这些:

for(Cdt::Finite_edges_iterator eit = cdt.finite_edges_begin(); eit != cdt.finite_edges_end(); ++eit) 
{
    CD_Cdt::Edge ed = *eit;

    ???
} 

enter image description here

  • 红线是边框

另外一件事,使用 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]); }

2 个答案:

答案 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 !!
    }
}