三角网格拓扑

时间:2009-05-14 18:26:02

标签: mesh connectivity topology

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

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

非常感激, 大卫拉滕

2 个答案:

答案 0 :(得分:2)

有两种有些标准的数据结构可以促进网状拓扑查询。一个是Winged Edges(通常也称为half-edge),另一个是Directed Edges。谷歌周围,你会得到各种细节,并为每一个细节提供各种级别的介绍。

对你的场景不够了解,不推荐其中一个。例如,有向边缘是存储优化的,并且最适合于非常大的网格。翼边被认为是“经典”,是更高级口味的良好起点。

实际上,如果你确定这是你需要的唯一一个查询,那么两者都是一种矫枉过正,而你只需要一个哈希即可。但是,如果您发现自己需要有效的答案,例如 -

  • 哪个面使用此顶点?
  • 哪个边缘使用此顶点?
  • 哪个面临这边缘?
  • 哪条边与这张脸相邻?
  • 哪个面与此相邻 面?

你应该考虑潜入其中一个。

答案 1 :(得分:0)

我想我已经盯着HashTables,Dictionaries和Sorted Lists了......以下可能是最容易和最快的:

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