我已经实现了一种catmull clark细分算法,该算法使用半边缘来处理除边界边缘以外的所有内容。边界边缘有一个指向null的双胞胎。事情是有效的,我得到了完全预期的结果,但我发现的文献中似乎提到所有边都是双边,我假设边界空面有一个与prev / next连接的循环。
我的算法大概是:
edgeMap[edgeA][edgeB]
和edgeMap[edgeB][edgeA]
twin->null
我的想法是在第二步中将所有具有空双胞胎的边缘推入数组。从该数组中选择任何边,并绕其顶点循环,直到击中另一个具有空双胞胎的边。每次,从边界阵列中移除该边缘,创建新的双胞胎,并为起始双胞胎计算下一个,并为下一个双胞胎计算上一个。当再次遇到来自数组的第一个选定边时,该边界完成,如果有任何左边和重复,则选择数组中的任何剩余边。
这是个好主意吗?我注意到,至少在绕顶点循环时,我必须进行两次比较 - 如果遇到起始边缘,还有twin->null
。我已经读过某个地方,如果在阵列中一个接一个地存储双胞胎,可以节省一些内存,但我不知道如何实现这一点。我的边缘列表基本上是循环后的每个多边形。这样我可以在创建每个边时分配prev和next indecis。
如果所有边都指向null,我怎么能轻易找到所有边界面?如果它们不应该指向null,那么如何管理indecis,因为它似乎与多边形列表有重叠?