【问题标题】:Creating and re-filling a hole inside existing Delaunay tetrahedralization在现有的 Delaunay 四面体中创建并重新填充一个洞
【发布时间】:2014-05-26 12:14:01
【问题描述】:

我正在尝试实现mesh generation algorithm。我使用CGAL::Delaunay_triangulation_3 类代表德劳内四面体化。

在算法的一个阶段(第 7 节:刻面恢复),我有一个 Delaunay 四面体化(比如DT0),我需要在 Delaunay 四面体化内创建一个空腔(或孔)C(从而对其进行转换说DT1)并通过在空腔的顶点上执行Delaunay四面体化(比如DT2)再次用新的四面体填充它。产生的四面体化不一定是纯粹 Delaunay(即,它可能有一些不满足empty sphere criteria 的单元格)。关于为什么需要创建和重新填充此类空腔的更多详细信息,请参见下面的上下文部分。

问题:
在 CGAL 中是否有可能在 现有的 Delaunay 四面体中创建这样一个空腔并用另一个四面体填充它?

相关详情:

  • Cavity C 是一个多面体,它的所有面都与DT0 中的单元格共享。
  • DT2 不代表 C 的顶点的完整 Delaunay 四面体化。它只包含C 内的那些四面体,其余的四面体被丢弃。
  • 我发现this question有些与我的有关,但仍未解决。

背景:
创建空腔并重新填充空腔的目的如下: 算法(上述)用于计算约束保留 Delaunay 四面体。算法的输入是一组顶点、段(一段连接 2 个顶点)和面(在我的情况下,这些是三角形)作为必须在最终四面体化中保留的约束。在这个问题中,我正在讨论算法的facet保留部分的实现。为了恢复最终四面体化中任何缺失的约束面,算法创建一个空腔并用四面体(或单元)重新填充它,这样一些单元的面的组合可以恢复约束面(即, f1+f2+...+fn=f 其中f1,f2..fn 是空腔中一些新创建的单元的面,f 是约束面,或者换句话说,f1,f2..fn 是输出四面体中f 的子面。输出四面体化在文献中称为Constrained Delaunay tetrahedralization,它可能是也可能不是Delaunay

我的尝试:
目前,我没有找到任何相关的 CGAL 类来直接解决这个问题,所以我正在考虑执行以下操作:

  1. 使用CGAL::Delaunay_triangulation_3 表示初始 Delaunay 四面体化DT0
  2. DT0 内部计算腔C 遵循算法并将C 表示为单独的Polyhedron_3 对象。剩余的四面体集统称为DT1
  3. 计算C 的顶点的Delaunay 四面体化DT2'
  4. DT2'(根据算法)中选择单元格来计算DT2
  5. 最后,合并DT1DT2。由于两者共享C的切面(由算法保证),所以原则上可以连接。

现在我正在考虑将DT1DT2 表示为std::list<Tetrahedron_3> 对象,但是如何合并它们以创建四面体?

【问题讨论】:

  • 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊软件开发者的一个众所周知的做法
  • @JoranBeasley 我已将 context 部分添加到我原来的问题中。我希望它能解释创建和重新填充空腔的目的。

标签: c++ algorithm computational-geometry mesh cgal


【解决方案1】:

这是在 CGAL 中实现点移除的方式。 您可能需要查看删除代码。

【讨论】:

  • 我知道当一个顶点从四面体化中移除时会创建一个空腔,并且将通过重新四面体化剩余的整个顶点集再次有效地填充。但就我而言(正如我现在在 context 中提到的),我还需要保留一些方面。我怀疑顶点移除程序可能无法保证这一点。此外,我希望原始四面体的剩余部分(即腔外的细胞)保持不变。
【解决方案2】:

阅读 CGAL 文档后,我意识到我可以用Linear cell complex 的形式来表示我的输出网格。我现在可以执行以下操作:

  1. 使用 import_from_triangulation_3() 将我原来的 Delaunay 四面体化导入线性单元复合体格式。
  2. 通过应用算法并使用remove_cell()在其中创建空腔。
  3. 使用空腔顶点的 Delaunay 四面体填充空腔(根据算法),并使用 sew3_same_facets()(未记录的函数)将这些新单元添加到原始四面体网格中。我从CGAL discussion forum 获得了sew3_same_facets() 的参考。

目前,我不接受我的回复作为答案,因为我仍在实施它。但我想同时分享它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2015-01-23
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多