在所有这种 do while 循环遍历一个点的所有临边都出现死循环
原因是终止条件是再次出现这个点对应的半边但是除了第一次后面的循环中并不会出现这个点指向的半边(而且有的时候是前几个不进循环所以没法只跳过第一个),还会突然从一个点跳到另一个点一下再跳回来
这是 collapse 部分新建的点指向的半边以及与周围半边链接的方法
该删的两个点 两个面 六个半边 三个边都删了,然后实验测试的是 cow 也是封闭图形,到底为什么会进这种死循环
这是 collapse 部分新建的点指向的半边以及与周围半边链接的方法
你可以先用简单的 cube 模型进行测试,方便找到和复现你的错误,自己检查是不是什么位置的指针写错了
你没有提到自己是在什么时候遍历操作出了问题,是在一轮操作全部完成的时候,还是正在迭代过程中检查坍缩是否可以进行的时候?下次提问的时候最好说清楚,否则我们只能靠猜测来回答。
根据你的描述,我猜你是在坍缩了一部分边之后,发现检查顶点 \mathscr{N}(v_1) 和 \mathscr{N}(v_2) 交集的时候死循环了。既然不断迭代 h22->inv->next
的时候出现了问题,你又只提到删除应该没问题,那么你可以先去检查 h22
的 inv
和 next
是否正确。或者说在坍缩操作里,你有没有设置好示意图上 h_1 和 h_2 这些半边的邻接关系?
请注意在删除一个几何元素的时候,其他元素与它的关联(指针)并不会自动消失。如果你删掉了一些半边又没重设其他半边的 inv
和 next
等指针,遍历时就有可能沿着被你删掉的半边走出了某些奇怪的循环。
你提到
在后续操作中只要出现了对这个有问题的点的邻域的遍历就会出现死循环
出现问题的这个点是collapse出来的新点
那几乎可以肯定是坍缩操作内部有问题,毕竟你除了坍缩以外也没做过其他修改半边网格的操作。如果你一时想不到有什么遗漏,我能提供的检查办法有两个:
validate
,只要在调用 collapse_edge
之后加一行 validate()
就行,比较方便但不一定能探查出错误。collapse_edge
里暂时注释掉之前的实现,重新对一遍示意图,凡是图上出现的半边全部用 set_neighbors
重设所有的邻接关系,不要逐个设置成员指针。