【问题标题】:How to obtain border edges (CGAL) after deleting some faces?删除一些面后如何获取边界边缘(CGAL)?
【发布时间】:2023-04-06 14:12:02
【问题描述】:

我有一个来自约束 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]); }

【问题讨论】:

  • 请参阅 2D 三角剖分数据结构的高级修饰符的文档:“为方便高级用户,需要以下修饰符。它们不保证生成的三角剖分的组合有效性。”删除面后,您需要对孔进行三角测量。
  • 与其删除您不感兴趣的面孔,不如将它们标记为“已删除”(面孔类型需要使用此信息进行扩充)。二维三角测量数据结构将保持其完整性。您可以将完全约束的 Delaunay 三角剖分的边界传播到您想要保留的有效面的子集。
  • 谢谢,帮了大忙!

标签: graphics geometry cgal


【解决方案1】:

只需检查边是否与无限面相邻。如果是这样,那么它是一个边界边缘。提醒:一条边是一对与该边相邻的面的句柄和作为第一个相邻面的另一个相邻面的索引。

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
    }
}

【讨论】:

    【解决方案2】:

    好的,我明白了,

    我发现了我的错误:删除人脸是一件非常非常糟糕的事情。因为它使 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 !!
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 2016-10-04
      • 2022-09-30
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多