标签: c++ algorithm computational-geometry mesh
我正在尝试通过执行一系列边缘折叠来实现网格简化算法。目前,我正在浏览每个三角形,然后折叠最短的边缘,算法是稳定的(不会超出界限)。但超越一点,它开始创造破碎(洞)的文物。确定边缘是否可折叠的正确方法是什么,这样才不会导致非流形伪影(或网格)?
注意:我使用半边数据结构。另外,我不想使用任何外部库,例如OpenMesh或CGAL。我有理由不使用它们。
OpenMesh
CGAL
答案 0 :(得分:22)
边缘崩溃有两个主要条件:
在折叠边缘的每一侧,只能合并一对边缘。这可以通过计算两个合并顶点的联合邻居顶点来检查(必须恰好有两个)。 请考虑以下示例,其中红色边缘正在折叠:
橙色和青色边缘之间的三角形不再是多方面的。
在边缘折叠期间,三角形不得翻转。这可以通过计算翻转之前的三角形法线与保持三角形的翻转之间的角度来检查。
以下是在崩溃期间翻转绿色三角形法线的示例: