我正在尝试实施mesh generation algorithm。我使用CGAL::Delaunay_triangulation_3
类代表Delaunay四面体化。
在算法的一个阶段(第7节:小平面恢复),我有一个Delaunay四面体化(比如DT0
),我需要在Delaunay四面体化中创建一个空洞(或洞)C
(从而将其变换为DT1
)并通过在腔的顶点上执行Delaunay四面体化(比如DT2
)再次用新的四面体填充它。得到的四面体化不必是纯 Delaunay(即,它可能有一些细胞不满足empty sphere criteria)。有关为何需要再次创建和重新填充空腔的详细信息,请参阅上下文部分。
问题:
在CGAL中是否有可能在现有的 Delaunay四面体化中创建这样的空腔并用另一个四面体化填充它?
详细信息:
C
是一个多面体,其所有方面与DT0
中的单元格共享。 DT2
不代表C
顶点的完全Delaunay四面体化。它只包含C
内的四面体,其余的四面体被丢弃。 上下文
创建腔体并重新填充腔体的目的如下:
算法(如上所述)用于计算保留 Delaunay四面体化的约束。算法的输入是一组顶点,段(一个段连接2个顶点)和facets(在我的例子中这些是三角形)作为约束给出,必须在最终的四面体化中保留。在这个问题中,我正在讨论算法的 facet preservation 部分的实现。为了在最后的四面体化中恢复任何缺失的约束面,算法创建一个腔并用四面体(或单元)重新填充它,使得这些单元中的一些面的组合恢复约束面(即,f1+f2+...+fn=f
其中f1,f2..fn
是空洞中一些新创建的单元格的方面,f
是约束方面,换句话说,f1,f2..fn
是{f
的子方面1}})在输出四面体化中。输出四面体化在文献中称为约束Delaunay四面体化,它可能是也可能不是 Delaunay 。
我的尝试:
目前,我没有找到任何相关的CGAL课程直接解决这个问题,所以我想做以下事情:
DT0
表示初始Delaunay四面体化CGAL::Delaunay_triangulation_3
。C
内计算腔DT0
,并将C
表示为单独的Polyhedron_3
对象。剩余的四面体组合由DT1
表示。 DT2'
顶点的Delaunay四面体化C
。DT2'
(根据算法)选择单元格以计算DT2
。DT1
和DT2
。由于两者共享C
的方面(由算法保证),因此它们原则上可以连接。 目前我正在考虑将DT1
和DT2
表示为std::list<Tetrahedron_3>
对象,但如何将它们合并以创建四面体化?
答案 0 :(得分:3)
这是在CGAL中实现点删除的方式。 您可能需要查看要删除的代码。
答案 1 :(得分:1)
阅读CGAL文档后,我意识到我可以用Linear cell complex的形式表示我的输出网格。我现在可以做到以下几点:
import_from_triangulation_3()
将原始Delaunay四面体化导入线性单元复杂格式。remove_cell()
。sew3_same_facets()
(未记录的函数)将这些新单元添加到原始四面体网格中。我从CGAL discussion forum获得了sew3_same_facets()
的参考。 现在,我不接受我的答复作为答案,因为我仍然在实施它。但我想同时分享它。