在2D网格中查找节点/顶点的邻居

时间:2015-01-15 19:28:31

标签: c++ graph nodes elements mesh

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

节点的结构:节点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元素网格简化示例提出,我正在处理的网格可能包含数千个节点和元素。 我也一直在研究图论的一些概念,但我不确定哪种方法可能是正确的。

1 个答案:

答案 0 :(得分:0)

最好让元素的顶点以它们形成闭合多边形的方式排序。顶点[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,...

如果会有很多此类查询,那么最好在单独的结构中制作提取连接信息。这可以是将节点映射到其邻居集合的映射。为了实现它,遍历所有元素,并且对于每个元素顶点,在节点列表中添加两个邻居。