删除数组中的重复项并更新引用索引。 (删除重复的顶点和面)

时间:2016-07-30 11:28:16

标签: c++ algorithm sorting graphics 3d

我需要找到一种快速删除网格重复顶点和面的方法。

顶点和面存储在缓冲区中,因为我使用大型数据集我使用boost::shared_array<float> vertexBufferboost::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的面都必须更新,因为它们改变了它们的位置。

任何想法如何实现?

非常感谢!

0 个答案:

没有答案