【问题标题】:Reconstruct all the edges in a triangle mesh重建三角形网格中的所有边
【发布时间】:2014-04-07 22:04:00
【问题描述】:

我有一个包含数百万个三角形的三角形网格。目前在我的数据结构中只存储了三角形和顶点。我想重建所有边缘并将它们存储在数据容器中。思路可能是这样的:遍历所有的三角形,得到它的每两个顶点,并在它们之间创建一条边。问题是共享边缘可能会创建两次。所以为了克服这个问题,我需要一个数据容器EdgeContainer 来存储边缘,它应该有一个功能来检查这个边缘是否已经创建。所以它就像一个有多个键的地图,但根据我的问题,这个地图还应该有以下功能:

  1. EdgeContainer(v1, v2) 应该返回与EdgeContainer(v2, v1) 相同的结果,其中v1v2 是指向两个顶点的指针。
  2. EdgeContainer 应该有一个类似EdgeContainer::Remove(v1) 的函数,它将删除所有与顶点v1 相关的边。
  3. 实施应尽可能高效。

是否有任何现有的库可以处理这个问题?

【问题讨论】:

  • 为什么一个简单的map<Vertex, vector<Vertex>> 不够用?
  • @NicoSchertler, Edge 必须明确存储以供进一步使用,即存储其长度或其他一些属性。您的提案无法处理,是吗?
  • 那就改成map<Vertex, vector<Edge*>>.
  • 如果你能够使用稀疏矩阵乘法,就像在 Matlab 中一样,那么这里有一个算法:mathproblems123.wordpress.com/2015/04/21/…

标签: c++ graphics hash map mesh


【解决方案1】:

首先我建议你看一下 半边http://www.flipcode.com/archives/The_Half-Edge_Data_Structure.shtml 网格,它用于 CGAL 和 OpenMesh,你应该知道你将使用它们中的任何一个的概念。 我自己推荐 OpenMesh http://openmesh.org/Documentation/OpenMesh-2.0-Documentation/tutorial_01.html 它是免费和开源的,您可以轻松地从一组顶点和索引创建网格,创建网格后您可以轻松地迭代所有边。

【讨论】:

    【解决方案2】:

    您最简单的选择是使用 Cgal 库,它基本上就是为此而设计的。

    http://doc.cgal.org/latest/Triangulation_2/index.html

    它提供了自然的迭代器来迭代面、边和顶点。

    请注意,在 Cgal 中,它们实际上并没有显式存储边,它们是生成的 每次迭代结构。这可以使用一些巧妙的规则有效地完成 这会阻止你计算两次:查看代码,似乎每张脸 迭代一次,并为当前面的每个相邻面添加一条边, 在人脸列表中比当前人脸更早。

    请注意,以这种方式访问​​边缘只需要每个边缘的恒定时间(取决于您存储面部的方式),因此您不太可能从单独存储它们中受益。另请注意,边是由两个相邻的面定义的,而不是由两个相邻的顶点定义的。您可以在恒定时间内转换它们。

    【讨论】:

      【解决方案3】:

      简单的解决方案是使用排序的索引对:

      struct _edge_desc : public std::pair<int,int> {
          _edge_desc(int a, int b): std::pair<int,int>(a<b?a:b, a<b?b:a) {}
      };
      std::set<_edge_desc> Edges;
      

      如果需要有关边的其他信息,则可以将其存储在单独的向量中,而不是使用集合来存储边,而是使用映射到向量中的索引的映射。

      std::vector<some_struct> EdgesInfo;
      std::map<_edge_desc, int> EdgesMap;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多