如何找到半边界面/双胞胎

时间:2017-04-11 04:10:19

标签: algorithm 3d mesh polygons edges

我已经实现了一种catmull clark细分算法,该算法使用半边缘来处理除边界边缘以外的所有内容。边界边缘有一个指向null的双胞胎。事情是有效的,我得到了完全预期的结果,但我发现的文献中似乎提到所有边都是双边,我假设边界空面有一个与prev / next连接的循环。

我的算法大概是:

  1. 遍历所有多边形
    1. 循环遍历所有顶点
    2. 在多边形中创建具有顶点和下一个顶点的边并将其推送到数组
    3. 连接prev和next边缘(根据vert num计算indecis)
    4. 将边缘索引写入地图边缘A-> edgeB-> edgeIndex
  2. 遍历所有边缘
    1. 查找edgeMap[edgeA][edgeB]edgeMap[edgeB][edgeA]
    2. 如果找到,请连接这两个边,否则请指定twin->null
  3. 我的想法是在第二步中将所有具有空双胞胎的边缘推入数组。从该数组中选择任何边,并绕其顶点循环,直到击中另一个具有空双胞胎的边。每次,从边界阵列中移除该边缘,创建新的双胞胎,并为起始双胞胎计算下一个,并为下一个双胞胎计算上一个。当再次遇到来自数组的第一个选定边时,该边界完成,如果有任何左边和重复,则选择数组中的任何剩余边。

    这是个好主意吗?我注意到,至少在绕顶点循环时,我必须进行两次比较 - 如果遇到起始边缘,还有twin->null。我已经读过某个地方,如果在阵列中一个接一个地存储双胞胎,可以节省一些内存,但我不知道如何实现这一点。我的边缘列表基本上是循环后的每个多边形。这样我可以在创建每个边时分配prev和next indecis。

    如果所有边都指向null,我怎么能轻易找到所有边界面?如果它们不应该指向null,那么如何管理indecis,因为它似乎与多边形列表有重叠?

0 个答案:

没有答案