我目前正在尝试实现一个简单的晶格气体模拟,该模拟涉及在六边形网格中反弹的粒子。首先,我需要生成网格,这里将对此进行更详细的描述。最终,我想创建某种数据结构(在Matlab或Python中(,其中包含每个节点的坐标,以及它的六个邻居中的每一个的身份(假设它不是边界节点(。
对我来说,主要的问题是弄清楚如何包含连接性。例如,假设我找到了一种方法来索引我所有节点的集合。给定某个节点i,我希望能够找到该节点的索引,说它是正确的。我可以开发一些一致的方法来枚举节点,这样我就可以计算它的邻居的索引,但如果我想生成不那么简单的网格,这并不能给我很大的灵活性。做这件事最好的方法是什么?我知道这是一个非常简单的问题,但我上一节计算机科学课已经有一段时间了,所以我现在几乎只熟悉向量/列表。提前感谢!
如果您熟悉python中的OOP并想要自定义,我建议您只需从头开始编写节点对象,并将其实现为类似于双链表,其中每个节点都拥有对其所有邻居的引用。
如果你坚持要将所有节点都保存在某种类似阵列的对象中,我建议使用一个类似2D阵列的对象,其索引类似于具有六边形网格的视频游戏处理坐标的方式。
n1 - n2 - n3
/ /
n4 - n5 - n6
/ / /
n7 - n8 - n9
使用上面的图形,您可以创建类似ls = [[n1,n2,n3],[n4,n5,n6],[n7,n8,n9]]
的内容。偶数行的右下节点的列索引将是它自己的列索引,左下节点将是它的列索引-1(例如,n2
在偶数行0中,引用n5
将是ls[1,1]
,因为n2
的行列索引是[0,1]。引用n4
将是ls[1,0]
(。同时,对于奇数行,它的右下节点列索引将是它自己的col索引+1,而它的左下节点列索引来它自己的coll索引。(示例:奇数行1中的n5
索引为[1,1],n9
将为ls[2,2]
,n8
将为ls[2,1]
(。
编辑:我索引ls
的方式是通过numpy的索引方法。如果你使用python内置列表,你需要单独的括号(例如,numpy中的ls[2,1]
是python内置列表的ls[2][1]
(