我需要找到一种快速删除网格重复顶点和面的方法。
顶点和面存储在缓冲区中,因为我使用大型数据集我使用boost::shared_array<float> vertexBuffer
和boost::shared_array<float> faceBuffer
作为缓冲区。
接下来,我创建一个KD-Search-Tree并检查每个点是否有一个dist(point, neighbour)<tollerance
的邻居。如果找到邻居,我将neigbour索引映射到unordered_map
:
oldToNewID[neighbour_id]=point_id
现在我想将地图中存储为值的所有顶点移动到顶点缓冲区的末尾。这里的问题是我还需要更改Face - Points的ID。
例如:
VertexBuffer:
1.3 4.5 3.7|1.8 4.5 3.7|1.3 4.5 3.7|4.3 8.5 2.7|4.9 4.5 2.7
-----------|-----------|-----------|-----------|-----------
Vertex 0 Vertex 1 Vertex 2 Vertex 3 Vertex 4
FaceBuffer:
0 1 3 | 1 2 3 | 4 0 1 | 2 3 4
------------------------------------------------
Face 0 | Face 1 | Face 2 | Face 3
现在Vertex 0和Vertex 2重复。所以现在我必须以某种方式有效地改变VertexBuffer和FaceBuffer,这样我才能得到:
更新了VertexBuffer:
1.3 4.5 3.7|1.8 4.5 3.7|4.3 8.5 2.7|4.9 4.5 2.7|1.3 4.5 3.7
-----------|-----------|-----------|-----------|-----------
Vertex 0 Vertex 1 Vertex 3 Vertex 4 Vertex 2
NewID 0 NewID 1 NewID 2 NewID 3
更新了FaceBuffer:
0 1 2 | 1 0 2 | 3 0 1 | 0 2 3
------------------------------------------------
Face 0 | Face 1 | Face 2 | Face 3
应将重复项移动到缓冲区的背面,并且需要更改引用Vertex 2的面。此外,每个参考Vertex 3和Vertex 4的面都必须更新,因为它们改变了它们的位置。
任何想法如何实现?
非常感谢!