Mi piacerebbe modificare un mio script Python che funziona su un reticolo quadrato (è un modello basato su agenti per la biologia), per lavorare in un universo esagonale.Generare, riempire e tracciare un reticolo esagonale in Python
Ecco come creare e inizializzare la matrice 2D nel modello quadrato: in pratica, N è la dimensione del reticolo e R indica il raggio della parte della matrice in cui è necessario modificare il valore all'inizio del algoritmo:
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
ho poi lascio la matrice evolvere in base alle leggi certains e infine stampare tramite la creazione di un file di salamoia:
name = "{0}-{1}-{2}-{3}-{4}.pickle".format(R, A1, A2, B1, B2)
pickle.dump(a, open(name,"w"))
Ora, vorrei fare esattamente lo stesso, ma su un reticolo esagonale. Ho letto this interessante domanda StackOverflow che chiarite come rappresentare le posizioni su un reticolo esagonale con tre coordinate, ma un paio di cose rimangono oscure, a mia conoscenza, vale a dire
(a) come dovrei trattare con i tre assi in Python , considerando che ciò che voglio non è equivalente a una matrice 3D, a causa dei vincoli sulle coordinate, e
(b) come tracciarlo?
Per quanto riguarda (a), questo è quello che stavo cercando di fare:
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
Mi sembra abbastanza contorto per inizializzare una matrice NxNxN del genere e poi trovare un modo per stampare un sottoinsieme di esso in base ai vincoli sulle coordinate. Sto cercando un modo più semplice e, cosa più importante, per capire come tracciare il reticolo esagonale risultante dall'algoritmo (non ho idea di ciò, non ho ancora provato nulla per il momento).