在现有的Delaunay四面体化中创建并重新填充孔

时间:2014-05-26 12:14:01

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

我正在尝试实施mesh generation algorithm。我使用CGAL::Delaunay_triangulation_3类代表Delaunay四面体化。

在算法的一个阶段(第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个顶点)和facets(在我的例子中这些是三角形)作为约束给出,必须在最终的四面体化中保留。在这个问题中,我正在讨论算法的 facet preservation 部分的实现。为了在最后的四面体化中恢复任何缺失的约束面,算法创建一个腔并用四面体(或单元)重新填充它,使得这些单元中的一些面的组合恢复约束面(即,f1+f2+...+fn=f其中f1,f2..fn是空洞中一些新创建的单元格的方面,f是约束方面,换句话说,f1,f2..fn是{f的子方面1}})在输出四面体化中。输出四面体化在文献中称为约束Delaunay四面体化,它可能是也可能不是 Delaunay

我的尝试:
目前,我没有找到任何相关的CGAL课程直接解决这个问题,所以我想做以下事情:

  1. 使用DT0表示初始Delaunay四面体化CGAL::Delaunay_triangulation_3
  2. 在算法后面C内计算腔DT0,并将C表示为单独的Polyhedron_3对象。剩余的四面体组合由DT1表示。
  3. 计算DT2'顶点的Delaunay四面体化C
  4. DT2'(根据算法)选择单元格以计算DT2
  5. 最后,合并DT1DT2。由于两者共享C的方面(由算法保证),因此它们原则上可以连接。
  6. 目前我正在考虑将DT1DT2表示为std::list<Tetrahedron_3>对象,但如何将它们合并以创建四面体化?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

阅读CGAL文档后,我意识到我可以用Linear cell complex的形式表示我的输出网格。我现在可以做到以下几点:

  1. 使用import_from_triangulation_3()将原始Delaunay四面体化导入线性单元复杂格式。
  2. 通过应用算法并使用remove_cell()
  3. 在其中创建空腔
  4. 使用腔的顶点的Delaunay四面体化填充腔(根据算法)并使用sew3_same_facets()(未记录的函数)将这些新单元添加到原始四面体网格中。我从CGAL discussion forum获得了sew3_same_facets()的参考。
  5. 现在,我不接受我的答复作为答案,因为我仍然在实施它。但我想同时分享它。