【问题标题】:Finding the neighbors of a node/vertex in a 2D mesh在二维网格中查找节点/顶点的邻居
【发布时间】:2015-01-15 19:28:30
【问题描述】:

我有一个由节点和元素定义的二维网格。

节点结构:节点ID、X位置、Y位置

元素的结构:元素ID、节点1、节点2、节点3、节点4

2x2 元素网格示例:

Nodes:

 ID  X  Y
  1  0  0
  2  0  1
  3  0  2
  4  1  0
  5  1  1
  6  1  2
  7  2  0
  8  2  1
  9  2  2

Elements:

 ID N1 N2 N3 N4
  1  1  2  4  5
  2  2  3  5  6  
  3  4  5  7  8
  4  5  6  8  9

N7-----N8-----N9
|      |      |
|  E3  |  E4  |
|      |      |
N4-----N5-----N6
|      |      |
|  E1  |  E2  |
|      |      |
N1-----N2-----N3

我将节点和元素都存储在链表中。

我的问题:如何找到任意选定节点的邻居(节点)?

例如,N5 的邻居是 N2、N4、N6 和 N8。

*注意:这个用于解释的 2x2 元素网格简化示例建议,我正在处理的网格可能包含数千个节点和元素。 我也一直在研究图论的一些概念,但我不确定哪个可能是正确的方法。

【问题讨论】:

  • 所有顶点都在一个平面(xy平面)吗?而且,它们是否覆盖了一个区域中的所有整数点?还是稀疏?
  • @TravisJ 是的,它们仅限于 xy 平面。并且顶点可能是稀疏的。
  • 当且仅当它们直接位于彼此的上方/下方/右侧/左侧时,它们是邻居吗? (之间没有其他节点)例如,如果图只有两个顶点,一个在 (0, 0),一个在 (1, 1),它们会相邻吗?另外,你知道你的图是连通的吗?
  • @TravisJ 这就是为什么我称它为网格而不是图形的原因,让我解释一下。我首先定义了一组点/节点/顶点,这些节点可以位于 xy 平面上的任何位置。然后我根据之前定义的节点定义元素。在我的例子中,一个元素定义有 4 个节点(任何 4 个节点)。如果两个节点共享一个元素的相同边,则两个节点是连接的,并且两个元素是连接的,它们至少共享一个节点。请注意,此时我没有“边缘列表”,只有节点和元素。
  • 所以你试图决定哪些元素(E1,E2,...)连接到哪些元素?如果是这样,您正在寻找的图形术语是平面图的对偶。网格图是平面图......图的面是你的元素。在图的对偶中,面成为顶点(元素是顶点),当对应的面共享一条边时,顶点是相连的。

标签: c++ graph nodes elements mesh


【解决方案1】:

最好让元素的顶点以它们构成闭合多边形的方式排序。顶点 [1, 2, 4, 5] 不唯一地定义第一个元素。从您的描述中可以看出,您的意思是一个具有四个顶点的多边形(1、2、5、4)。但是没有图片也可以退化成四边形(1,2,4,5)。

喜欢:

Elements:

 ID N1 N2 N3 N4
  1  1  2  5  4
  2  2  3  6  5
  3  4  5  8  7
  4  5  6  9  8

如果您不确定顶点顺序,则必须检查元素自相交,并重新排列顶点以解决相交问题。

有了这种数据,很容易找到给定节点的所有邻居。遍历所有元素,如果元素包含给定节点,则该元素中有两个邻居,即列表中的顶点之前和之后。

对于节点 5,在第一个元素中有邻居 2 和 4,在第二个元素中有邻居 6 和 2,...

如果有很多这样的查询,最好在单独的结构中提取连接信息。这可以是将节点映射到其邻居集的映射。要做到这一点,请遍历所有元素,并为每个元素顶点在节点列表中添加两个邻居。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2019-10-20
    • 1970-01-01
    • 2020-07-30
    • 2010-10-13
    相关资源
    最近更新 更多