【问题标题】:Algorithm for unique find edges from polygon mesh从多边形网格中寻找唯一边的算法
【发布时间】:2010-09-17 11:45:02
【问题描述】:

我正在寻找一种可以从一组多边形数据中获得独特边缘的好算法。在这种情况下,多边形由两个数组定义。一个数组是每个多边形的点数,另一个数组是顶点索引列表。

我有一个正在运行的版本,但是当多边形数超过 500,000 时性能会变慢。我的版本遍历每个面并将每个边的排序顶点添加到 stl::set。我的数据集主要是三角形和四边形多边形,并且大部分边都是共享的。

有没有更智能的算法?

【问题讨论】:

    标签: graphics geometry polygon mesh edge-detection


    【解决方案1】:
    【解决方案2】:

    首先,您需要确保您的顶点是唯一的。也就是说,如果您只想在某个位置有一条边。然后我用这个数据结构

    typedef std::pair<int, int> Edge;

    Edge sampleEdge;

    std::map<Edge, bool> uniqueEdges;

    Edge 包含按排序顺序构成边的顶点索引。因此,如果 sampleEdge 是由索引号为 12 和 5 的顶点组成的边,则 sampleEdge.first = 5 和 sampleEdge.12

    那你就可以了

    uniqueEdges[sampleEdge] = true;

    对于所有的边缘。 uniqueEdges 将保存所有独特的边。

    【讨论】:

      【解决方案3】:

      你说的都是对的。使用良好的哈希集已使性能远远超出所需水平。我最终滚动了自己的小哈希集。

      边的总数将在 N/2 和 N 之间。N 是网格中唯一顶点的数量。所有共享边都是 N/2,所有唯一边都是 N。从那里我分配一个 uint64 缓冲区并将我的索引打包到这些值中。使用一小组独特的表格,我可以快速找到独特的边缘!

      【讨论】:

        【解决方案4】:

        是的
        使用双哈希映射。
        每条边都有两个索引 A,B。假设 A > B。
        第一个顶级哈希映射将 A 映射到另一个哈希映射,该哈希映射又将 B 映射到某个值,该值表示您想要的关于每条边的信息。 (或者如果您不需要保留边缘信息,则只是一个布尔值)。
        本质上,这会创建一个由哈希映射组成的两级树。

        要在这个结构中查找一个边,你需要更大的索引,在顶层查找它并最终得到一个哈希映射。然后取较小的索引并在第二个哈希映射中查找它。

        【讨论】:

        • 如果我理解正确,你最终会得到一个唯一的第一级哈希图,但有很多 2º 级哈希图(每个 A 值一个)。我想知道 2º 级别的哈希图是否真的有帮助,第二个哈希图中是否有足够的 B 值?
        【解决方案5】:

        只是为了澄清,你想要这样的多边形列表:

        A +-----+ B
           \    |\
            \ 1 | \
             \  |  \
              \ | 2 \
               \|    \
              C +-----+ D
        

        然后不是这样的边缘:

        A - B -+
        B - C  +- first polygon
        C - A -+
        
        B - D -+
        D - C  +- second polygon
        C - B -+
        

        那么您要删除重复的 B - C 与 C - B 边缘并共享它吗?

        您的算法遇到了什么样的性能问题?我想说一个具有合理哈希实现的集合应该执行得很好。另一方面,如果您的散列对于数据而言不是最优的,则会发生很多可能严重影响性能的冲突。

        【讨论】:

          猜你喜欢
          • 2011-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-09
          • 2013-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多