Ors*_*rso 5 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) ) < pow(R,2) ):
a[i,j] = 1
Run Code Online (Sandbox Code Playgroud)
然后我让矩阵根据某些规则进化,最后通过创建一个pickle文件进行打印:
name = "{0}-{1}-{2}-{3}-{4}.pickle".format(R, A1, A2, B1, B2)
pickle.dump(a, open(name,"w"))
Run Code Online (Sandbox Code Playgroud)
现在,我想在六角形格子上做同样的事情.我读到了这个有趣的StackOverflow问题,该问题清楚地表明了如何用三个坐标表示六边形网格上的位置,但是有些事情在我的知识中仍然模糊不清,即
(a)我应该如何处理Python中的三个轴,考虑到由于坐标的限制,我想要的并不等同于3D矩阵,以及
(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
Run Code Online (Sandbox Code Playgroud)
在我看来,初始化像这样的NxNxN矩阵,然后根据坐标上的约束找到一种打印它的子集的方法.我正在寻找一种更简单的方法,更重要的是,要了解如何绘制算法产生的六边形格子(没有任何线索,我暂时没有尝试过任何东西).
我同意尝试将六方晶格硬塞进立方晶格是有问题的。我的建议是使用一个通用方案 - 将相邻站点表示为图表。这与 python 字典对象配合得很好,并且在您提供的链接之一中实现“轴向坐标方案”很简单。下面是一个使用 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()
Run Code Online (Sandbox Code Playgroud)

这不是最佳实现,但它可以生成任意大的格子:
| 归档时间: |
|
| 查看次数: |
5777 次 |
| 最近记录: |