在进行坍缩时,我的想法是保留 v1 并调整位置,删除 v2(v1v2 为给定边的两个点),因此需要遍历 v2 所有的指出的半边,并将其 from 信息改为 v1,代码逻辑为:
Halfedge* temp_h = v2->halfedge;
do {
temp_h->from = v1;
temp_h = temp_h->inv->next;
logger->warn("id: {}", temp_h->id);
logger->warn("##########id: {}", v2->halfedge->id);
} while (temp_h != v2->halfedge);
而在运行时,对于 teapot 这个模型来说(cow 模型有同样的问题),杯身部分的横向边,斜边能够正常坍缩,但是对于竖边,遍历时会出现问题,遍历顺序见下图(通过打印 halfedge 的 id 与界面显示 id 对照确认),这样就导致死循环,请问为什么会出现这种现象?
(坍缩了右侧一条斜边与一条横边的结果)
(试图坍缩竖边时的错误遍历顺序,图中 0 为 v2 的 halfedge,而 12345678 为陷入死循环后的遍历顺序)
可以看出问题在于遍历到 3 号边(id7499)时,下一条正常应为(id 7504),而却变为了(id 7508)。当我在程序中手动进行(id 7499)->inv->next 时,得到(id 7504)