2017-12-21 36 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

알고리즘이 6 각형 그리드에서 실행되는 경우 시각화에 'hexbin'을 사용하면 문제가 없습니다. – ImportanceOfBeingErnest

+0

사각형 그리드에서 육각형 그리드로 어떻게 올바르게 매핑합니까? 나는 각 열 타일을 데카르트 그리드의 한 점에 대응하는 인덱스 i, j로 식별 할 수 있습니다 (두 번째 행은 어느 정도 측면으로 이동됩니다). 그러나 나는 이것이 내가 이미했던 것이라고 생각했습니다. – andynitrox