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

2024-04-29 19:13:28 发布

您现在位置: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

然后,我让矩阵根据certains规则发展,最后通过创建pickle文件来打印:

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

现在,我想在六边形格子上做同样的事情。我读到了一个有趣的StackOverflow问题,它清楚地说明了如何用三个坐标来表示六边形晶格上的位置,但是有两件事我还不清楚,即

(a)考虑到由于坐标的限制,我想要的并不等同于三维矩阵,我应该如何处理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

在我看来,像那样初始化NxNxN矩阵,然后根据坐标上的约束找到打印其子集的方法是相当复杂的。我正在寻找一种更简单的方法,更重要的是,为了理解如何绘制算法产生的六边形晶格(对此毫无头绪,我暂时还没有尝试过任何方法)。


Tags: 方法in模型算法for矩阵abs晶格
1条回答
网友
1楼 · 发布于 2024-04-29 19:13:28

我同意把六边形晶格压缩成立方晶格是有问题的。我的建议是使用一个通用方案-将相邻站点表示为。这对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

相关问题 更多 >