几何部分,关于 collapse 在边界上的情况

我能够对已经确认是边界的边进行坍缩处理,但是我发现当我在连续的坍缩过程中产生的新的边界似乎不能有效处理
而且不知道是不是我的实现有问题,我遇到的情况是,菱形的两个三角形面重合到了一起,v3 和 v4 是同一个节点,形成一个片
我注意到判断一个边是否为边界仅仅依靠 face 中的 is_boundry 这个值来判断,也就是说如果我们在坍缩过程中产生了新的片,必须自己将 is_boundry 置为 true,但是具体的代码实现我没什么思路,求大佬相助

实验中不要求处理非封闭网格,不过也欢迎来和我们讨论这个问题。

首先你提到了“在连续的坍缩过程中产生的新的边界”,但如果你坍缩的是一个面数较多的网格,这种情况不太可能发生:

  • 坍缩一条边界上的边,不会产生新的边界(边界环越坍缩越小);
  • 坍缩一条内部的边,只有它的两个端点都位于边界上时才会产生新的边界(一条边连接了两个边界环,坍缩它导致连接处“断开”了)。

如何处理这种情况取决于你是否能接受这种“断裂”,我比较倾向于在第二种情况下直接放弃坍缩,因为这会产生一个同时属于两条边界的顶点,性质非常不好。

然后,你说

菱形的两个三角形面重合到了一起,v3 和 v4 是同一个节点

我认为这种情况来自你的实现问题,理由有二:

  • 如果 v3 和 v4 的 id 不同但坐标相同(也就是两个重合的顶点),那么 validate 函数应该会检测出这种问题,并提示有多个顶点的坐标相同;
  • 如果 v3 和 v4 完全是一个顶点(id 也相同),那就意味着 v_1\rightarrow v_2\rightarrow v_3v_2\rightarrow v_1\rightarrow v_4 这两个 face loop 是重叠且反向的。除非整个网格只剩下两个重叠的三角形,否则这就是一种非法状态,如果构造半边网格时局部出现了这种状态,应该会直接结束构造并提示失败。而一个合法的半边网格经过一系列合法操作后,不应该出现这种非法状态。

也许是你没有正确地实现局部操作,或者没有正确地判断是否应该进行局部操作。

另外,你对“片”的描述很不清楚,它是指一个三角形面、一个半边网格的 face loop,还是什么其他的东西?我不能理解你说的“片”是什么,也因此想象不到为什么 v_3v_4 相同时会产生新的“片”。如果在你描述的情况下强行坍缩,那么得到的应该只有一条边,不会产生什么新的东西。请至少给出一个比较严谨的定义,最好能给出示意图(草图即可,不必精细)。