Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中生成、填充和绘制六边形晶格_Python_Plot_Hexagonal Tiles - Fatal编程技术网

在Python中生成、填充和绘制六边形晶格

在Python中生成、填充和绘制六边形晶格,python,plot,hexagonal-tiles,Python,Plot,Hexagonal Tiles,我想修改一个在正方形晶格上运行的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)

我想修改一个在正方形晶格上运行的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
现在,我想做完全相同的,但在六边形晶格上。我读了一个有趣的StackOverflow问题,它清楚地说明了如何用三个坐标表示六边形晶格上的位置,但有两件事我还不清楚,即

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

(b) 如何绘制它

至于(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
a=np.zero(形状=(N,N,N))
对于X范围内的i(N/2-R,N/2+R+1):
对于X范围内的j(N/2-R,N/2+R+1):
对于X范围内的k(N/2-R,N/2+R+1):

如果((abs(i)+abs(j)+abs(k))/2我同意尝试将六边形晶格塞入立方体是有问题的。我的建议是使用一个通用方案-将相邻的位置表示为一个图形。这对pythons dictionary对象非常有效,实现“轴向坐标方案”非常简单下面是一个使用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()

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

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()