我正在进行一个项目,该项目需要将三角汤转换为实际的结构化网格,以便将操作应用于网格。 网格对象是具有以下各项的半边型结构:
Vertex { vec3 position, int edge /* any half edge leaving the vertex */}
HalfEdge {int vertex, int pair}
Triangle {int vertex[3], int normal[3]}
BoundaryEdge {int vertex, int pair, int next, int prev}
索引将所有内容都引用到这些项目的数组中。 我已经到了连接所有内部边缘以及设置所有边缘和边界边缘对的地步,我的问题是如何为边界边缘循环设置下一个和上一个索引(即,如何找到这些索引)从未连接的边界边列表中循环)。
如果循环都很简单,那将很容易。 但是,我正在使用的网格可以具有边界“结点”,即共享一个顶点的多个边界环。 这样一来,在创建边界循环时就存在一些要点,其中算法必须确定多个可能的边中的哪一个是要循环的正确下一个边。 如果选择了错误的边缘,则可能无法遍历入射到顶点的所有边缘。
到目前为止,我所遇到的是每次遇到这样的交界处时,代码基本上都会查看离开和进入顶点的半边的下一个索引和上一个索引的所有可能分配,并找到使它成为第一个的分配因此,从离开顶点的任何一个半边开始,可以使用edge.pair.next访问每个其他这样的半边(仅这些边),以到达下一个这样的半边。 当前,该解决方案效率不是很高(我不认为),我什至都不知道它是否正确,并且添加与1个或更少的三角形相邻的三角形也存在相同的问题。
我想知道的是,a。)我的解决方案是否真的可以正常工作,b。)是否还有另一个更常用/更常用的解决方案来找到我尚未找到的这些边缘循环?