我想修改我的Python脚本,该脚本在正方形晶格上运行(这是生物学的基于代理的模型),以在六边形宇宙中工作。

这就是我在正方形模型中创建和初始化2D矩阵的方式:基本上,N是晶格的大小,R给出了在算法开始时需要更改值的矩阵部分的半径:

a = np.zeros(shape=(N,N))
center = N/2

for i in xrange(N):
    for j in xrange(N):
        if( ( pow((i-center),2) + pow((j-center),2) ) < pow(R,2) ):
            a[i,j] = 1

然后,我让矩阵根据确定的规则进行演化,最后通过创建一个pickle文件进行打印:
name = "{0}-{1}-{2}-{3}-{4}.pickle".format(R, A1, A2, B1, B2)
pickle.dump(a, open(name,"w"))

现在,我想做的完全一样,只是在六角形格子上。我读了ojit_一个有趣的StackOverflow问题,该问题阐明了如何用三个坐标表示六边形格子上的位置,但是据我所知,有两件事仍然晦涩难懂,即

(a)考虑到由于坐标的限制,我想要的东西不等于3D矩阵,因此我应该如何处理Python中的三个轴,以及

(二)如何作图?

至于(a),这就是我想要做的:
a = np.zeros(shape=(N,N,N))

for i in xrange(N/2-R, N/2+R+1):
    for j in xrange(N/2-R, N/2+R+1):
        for k in xrange(N/2-R, N/2+R+1):
            if((abs(i)+abs(j)+abs(k))/2 <= 3*N/4+R/2):
                a[i,j,k] = 1

在我看来,像这样初始化一个NxNxN矩阵非常费时费力,然后找到一种根据坐标上的约束来打印其子集的方法。我正在寻找一种更简单的方法,更重要的是,为了了解如何绘制算法产生的六边形格子(对此一无所知,目前我还没有尝试过任何方法)。

最佳答案

我同意尝试将六边形格子刺成立方体是有问题的。我的建议是使用通用方案-将相邻站点表示为图形。这对于pythons字典对象非常有效,并且在您提供的链接之一中实现“轴向坐标方案”很简单。这是一个使用networkx创建和绘制“晶格”的示例。

import networkx as nx
G = nx.Graph(directed=False)
G.add_node((0,0))

for n in xrange(4):
    for (q,r) in G.nodes():
        G.add_edge((q,r),(q,r-1))
        G.add_edge((q,r),(q-1,r))
        G.add_edge((q,r),(q-1,r+1))
        G.add_edge((q,r),(q,r+1))
        G.add_edge((q,r),(q+1,r-1))
        G.add_edge((q,r),(q+1,r))

pos = nx.graphviz_layout(G,prog="neato")
nx.draw(G,pos,alpha=.75)

import pylab as plt
plt.axis('equal')
plt.show()

这不是最佳的实现,但是它可以生成任意大的晶格:

10-08 11:57