2017-12-21 22 views
1

私はPythonの六角形グリッド上にGame of Lifeのクローンを作成しようとしています。私はhexbinを使用して結果を表示し、アニメーションを作成するために定期的に更新しました。予期せぬ色を示すmatplotlibのHexgrid

各セルの値は0または1で、白黒タイルとして表示するにはGreysカラーマップを使用しています。しかし出力では、値が1に設定されていても、センタータイルは黒ではなく灰色で表示されます(これらのタイルの値を確認するためにprintステートメントを使用しました)。

enter image description here

どのように私はそれを削除することができますか? Spectralなどの異なるカラーマップでは、この問題がより顕著になります。この場合は水平線が表示されます)。私は、この問題が現れなかった長方形のグリッドを持つ同じプロジェクトの前に、ほぼ同じコードを使用しました。

# -*- coding: utf-8 -*- 

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import matplotlib.mlab as mlab 


n = 20  # number of rows 
alive = 1  # value of a cell that is alive 
dead = 0  # value of a dead cell 
pause = False 

x = y = np.arange(0, n, 1.0) 
X, Y = np.meshgrid(x, y) 
Z = np.zeros((n, n)) 
Z[10][10] = Z[9][11] = Z[10][11] = Z[9][9] = 1 

x = X.ravel() 
y = Y.ravel() 
z = Z.ravel() 

def update(*args): 
    if not pause: 
     advance() 

# this is the main function that advances the animation by one frame (time step) 
def advance(*args): 
    global Z 
    newZ = Z.copy() 
    for i in range(n): 
     for j in range(n): 
      total = (Z[i][(j-1)%n] + Z[i][(j+1)%n] + Z[(i-1)%n][j] + Z[(i+1)%n][j] + Z[(i-1)%n][(j-1)%n] + Z[(i+1)%n][(j-1)%n]) 

      if Z[i][j] == alive: 
       if (total < 2) or (total > 4): 
        newZ[i][j] = dead 
      else: 
       if total == 2: 
        newZ[i][j] = alive 
    Z = newZ 
    z = Z.ravel() 
    grid = plt.hexbin(x, y, z, gridsize=n, cmap="Spectral") 
    return [grid] 

fig = plt.figure(figsize=(5, 5)) 
ax = plt.subplot() 
ani = animation.FuncAnimation(fig, update, interval=50) 
plt.show() 

答えて

2

ゲームアルゴリズムを実行するために四角いグリッドを使用しています。次に、結果を六角形のグリッドにマップします。これは、いくつかの正方形のグリッド値が、六角形グリッドの同じセルにあり(その値に加算されます)、いくつかの六角形のグリッドセルは、いずれのsqaureグリッドセルもヒットしないため、空であることを意味します。

enter image description here

例として、あなたは見ることができ、例えば(0.5,2.5)を中心とする六角形グリッドのセルには、元の正方形グリッドの位置は含まれません。したがって、このセルは空のままです。

人生のゲームはグリッド自体に強く依存しているため、別のグリッドを使用することは意味がありません。だから正方形のグリッドに留まってください。あるいは、人生のゲームを別のグリッド上で実行し、使用中のグリッドを考慮して完全なアルゴリズムを変更してください。

+0

ありがとう、私はこれがバックグラウンドで起こっているとは思わなかった。私の目標は、実際にGoLを適合ルール付きの16進グリッド上で実行させることです。フォローアップの質問として:タイルを視覚化するための良いアプローチは何でしょうか?個々のポリゴンを通して? – andynitrox

+0

あなたのアルゴリズムが六角形のグリッドで実行されている場合は、可視化のために 'hexbin'を使用しても問題ありません。 – ImportanceOfBeingErnest

+0

どのように矩形から六角形のグリッドに正しくマップできますか?私は、デカルトタイルを、デカルト格子上の点にも対応するインデックスi、jで識別することができます(各2行目はある量だけ横に移動します)。しかし、私はこれがすでに私が行ったことだと思った。 – andynitrox

関連する問題