我有一个由节点和元素定义的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元素网格简化示例提出,我正在处理的网格可能包含数千个节点和元素。 我也一直在研究图论的一些概念,但我不确定哪种方法可能是正确的。
答案 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,...
如果会有很多此类查询,那么最好在单独的结构中制作提取连接信息。这可以是将节点映射到其邻居集合的映射。为了实现它,遍历所有元素,并且对于每个元素顶点,在节点列表中添加两个邻居。