我有分离网格的问题。有一个组合网格,它有1个顶点缓冲区和1个三角形索引缓冲区。但是网格至少有2个分离的对象。例如,有2个四边形没有顶点共享(当然没有共享索引),它们的几何形状是1个单个网格(1个顶点缓冲区,1个索引缓冲区)。那么如何从它们创建2个网格。是否有任何算法。
我试图在新网格中添加第一个顶点然后查找指向此顶点的索引,然后我将此索引及其相关的2个三角形索引(和顶点)添加到新网格中但索引必须更改
我很抱歉找不到有关我的问题的信息。我打算分开逻辑。例如在编程中。如果下面的单个网格具有非共享子网格,如图中所示。我希望它分成2个网格类。我想要一个算法数学解决方案,而不是为我做这个的工具。
答案 0 :(得分:1)
首先,使用顶点数初始化union-find数据结构。然后按如下方式查找所有连接的组件:
for each triangle index i1, i2, i3 in indices
union-find.union(i1, i2)
union-find.union(i1, i3)
然后初始化一个将旧顶点索引映射到新顶点索引的空映射(或字典):
Dictionary<int, int> indexMap;
此外,我们需要新的顶点列表:
Dictionary<int, List<Vertex>> vertices;
Dictionary<int, List<int>> indices;
然后将顶点分配到正确的列表,如下所示:
for i from 0 to vertex count -1
componentRepresentative := union-find.find(i)
if(!vertices.ContainsKey(componentRepresentative))
vertices.Add(new List<Vertex>());
indices.Add(new List<int>());
var list = vertices[componentRepresentative];
list.Add(vertexBuffer[i]);
indexMap.Add(i, list.Count - 1)
此时我们已经分离了顶点缓冲区。我们仍然需要类似地分离索引缓冲区。
for i from 0 to index count - 1
componentRepresentative := union-find.find(indexbuffer[i])
var list = indices[componentRepresentative]
list.Add(indexMap[indexBuffer[i]])
总时间复杂度几乎为O(n)(对于理想的联合查找结构)。