2014-11-24 676 views
5

我想修改一个在正方形网格(它是基于代理的生物学模型)上运行的Python脚本,以在六边形的宇宙中工作。在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 

我那么就让根据某些码规则的矩阵进化并最终通过建立一个咸菜文件的打印:

name = "{0}-{1}-{2}-{3}-{4}.pickle".format(R, A1, A2, B1, B2) 
pickle.dump(a, open(name,"w")) 

现在,我想要做的完全一样的,但是,六角格子。我读了this有趣的StackOverflow问题,它清楚地说明了如何用三个坐标表示六边形网格上的位置,但是有几件事情我的知识仍不明确, ,考虑到我想要的不等同于3D矩阵,由于坐标的限制,并且(b)如何绘制它?

至于(一),这就是我要怎样做:

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矩阵一样,然后找到一种方法来打印它的一个子集根据对坐标的约束。我正在寻找一种更简单的方法,更重要的是,要理解如何绘制算法产生的六角网格(对此没有线索,我暂时还没有尝试过任何方法)。

回答

3

我同意试图将六角形格子塞入立方体是有问题的。我的建议是使用一个通用的方案 - 将相邻网站表示为。这对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() 

enter image description here

这是不是最优化的实现,但它可以产生任意大格子:

enter image description here