2

我正在做一个项目,该项目需要将三角形汤转换为实际的结构化网格,以便将操作应用于网格。网格对象是一个半边型结构,具有以下项目:

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.) 是否有另一种更常见/使用的解决方案来找到我还没有找到的这些边缘循环?

4

1 回答 1

0

我遇到了类似的问题。我的情况是几个区域(表示为一组三角形)在一个顶点/顶点处相交,它们是边界。目标是找到每个区域的边界。我发现使用单环邻域(即 edge.pair.next)既困难又低效。

我所做的是,对于每个区域,我都会考虑所有三角形并寻找边界边缘。每当我找到边界边缘时,我都会将starting_vertex 和ending_vertex 记录到hashmap(map[starting_vertex]=ending_vertex, map[ending_vertex]=starting_vertex) 中。在您遍历该区域中的所有三角形后,您将从边界顶点开始并使用哈希图来构造边界。

如果三角剖分边界上有洞,则上述方法将失败,因为三角剖分不是流形。解决方法: 1. 如果原始表面有孔,请尝试使用插值来填充孔。2. 如果原始曲面上没有孔,但生成的三角剖分有一个,那么问题是由于生成三角剖分的代码不佳造成的。因此,您可能想要更改生成三角剖分的算法。

于 2015-07-20T20:28:38.593 回答