from pylab import *
from scipy.ndimage import filters,measurements
import pygame
from pygame import surfarray
matplotlib.rc("image",cmap="gray")
matplotlib.rc("image",interpolation="nearest")
pygame.init()
OR = logical_or
AND = logical_and
def unif(lo,hi,size=1):
if size==1: return rand()*(hi-lo)+lo
if type(size)==int: return rand(size)*(hi-lo)+lo
return rand(*size)*(hi-lo)+lo
w,h = 512,512
screen = pygame.display.set_mode((w,h))
surface = pygame.Surface((w,h),depth=8)
def animate(images,n=20):
for i,image in enumerate(images):
if i>=n: break
b = array(255*clip(image,0,1),'B')
pygame.surfarray.blit_array(surface,b[:w,:h])
screen.blit(surface,(0,0))
pygame.display.flip()
return image
def random(p):
return 1.0*(rand(w,h)<p)
def iterate(f,a,n=100000):
for i in range(n):
yield a
a = f(a)
yield a
LargerThanLife:
LargerThanLife - Bugs:
LargerThanLife implementation:
uniform_filter
returns "average", so we need to scale up to match bugsdef bugs(s):
a = array(s!=0,'f')
n = floor(0.5+11*11*filters.uniform_filter(a,11,mode='wrap')-a)
return 1.0*AND(n>=34,OR(n<=45,AND(n<=58,a)))
_=animate(iterate(bugs,random(0.5)),2000)
For comparison, here is Conway's Game of Life using linear filters.
def life(s):
a = array(s!=0,'f')
n = floor(0.5+3*3*filters.uniform_filter(a,3,mode='wrap')-a)
return AND(n>=2,OR(n==3,AND(n<=3,a)))
_=animate(iterate(life,random(0.5)),2000)
RealLife: