【问题标题】:Triangular mesh topology三角网状拓扑
【发布时间】:2010-10-26 06:46:06
【问题描述】:

我有一个三角形网格类,其中包含一个节点列表(在我的例子中是 2d,但这不重要)和一个面列表。每个面都是一个三角形,它只包含节点数组的索引。网格来自 Delaunay 算法,因此非常干净。

对于网格中的每个节点,我需要找出哪些节点通过一条边连接到它。构建和搜索此拓扑数据库的快速方法是什么?

非常感谢, 大卫·鲁滕

【问题讨论】:

    标签: mesh connectivity topology


    【解决方案1】:

    有两个有点标准的数据结构有助于网格拓扑查询。一种是Winged Edges(通常也称为half-edge),另一种是Directed Edges。谷歌一下,你会得到海量的细节,以及每个细节的不同层次的介绍。

    对您的场景了解不够,无法推荐其中一种。例如,有向边是存储优化的,最适合非常大的网格。带翅膀的边缘被认为是“经典”,是更高级口味的良好起点。

    实际上,如果您确定这是您需要的唯一查询,那么两者都过大了,您只需使用一个哈希就可以了。但是,如果您发现自己需要有效回答以下问题 -

    • 哪些面使用此顶点?
    • 哪些边使用该顶点?
    • 哪些面与这条边接壤?
    • 这张脸的边缘是哪些?
    • 哪些面与此相邻 脸?

    您应该考虑深入其中之一。

    【讨论】:

      【解决方案2】:

      我想我对哈希表、字典和排序列表视而不见......以下可能是最简单和最快的:

      Public Sub SolveConnectivity(ByVal nodes As Node2List, ByVal faces As List(Of Face))
        m_map = New List(Of List(Of Int32))(nodes.Count)
      
        'Create blank lists
        For i As Int32 = 0 To nodes.Count - 1
          m_map.Add(New List(Of Int32)(6))
        Next
      
        'Populate connectivity diagram
        For i As Int32 = 0 To faces.Count - 1
          Dim F As Face = faces(i)
          m_map(F.A).Add(F.B)
          m_map(F.A).Add(F.C)
      
          m_map(F.B).Add(F.A)
          m_map(F.B).Add(F.C)
      
          m_map(F.C).Add(F.A)
          m_map(F.C).Add(F.B)
        Next
      End Sub
      

      【讨论】:

      • 为避免人们认为您只是在重复收割,最好 1) 等待一段时间再发布您自己的答案或 2) 将此答案移至原始问题。
      • @Scottie T:这种自我回答是允许的,甚至是常见问题解答鼓励的。我倾向于让答案 CW 因为否则感觉就像在玩 TFGITW 问题。见:stackoverflow.com/questions/18557/…
      • Scottie,我不知道,感谢您指出。不过我想我现在不会再修补它了。
      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 2011-03-31
      • 2011-05-08
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      相关资源
      最近更新 更多