In [2]:
import numpy as np
import matplotlib.pyplot as plt
import random

attractor = [np.array([0,0])]
steptypes = ((-1,0), (+1,0), (0,+1), (0, -1))
stepsize = 0.1
numparticles = 100
partrad = 0.3
squaresize = 10
spawnradius = 8.0


def CheckBoundary(p):
    c = 1.1*partrad
    if (p[0] < -squaresize):
        p[0] = -squaresize + c
    elif (p[0] > squaresize):    
        p[0] = squaresize - c
        
    if (p[1] < -squaresize):    
        p[1] = -squaresize + c
    elif (p[1] > squaresize):    
        p[1] = squaresize - c
        
    return p

def NextStep():  
    sx,sy = steptypes[random.randint(1,4)-1]
    return np.array([stepsize*sx,stepsize*sy])



for i in range(numparticles):
    free = True
    t = random.uniform(0.0,2.0*np.pi)
    pos = np.array([spawnradius*np.cos(t),spawnradius*np.sin(t)])    
    while (free):        
        for attpoint in attractor:            
            d = np.linalg.norm(pos-attpoint)            
            if (d < 2.0*partrad):
                free = False
                pos = attpoint + (2.0*partrad/d)*(pos-attpoint)                
                attractor.append(pos)
                break
        pos += NextStep()
        pos = CheckBoundary(pos)
        

plt.scatter(*zip(*attractor),s=30.0,facecolors='none', edgecolors='r')
plt.ylabel('')
plt.xlabel('')
plt.title('Diffusion Limited Aggregation')
plt.axis([-squaresize,squaresize,-squaresize,squaresize])
plt.gca().set_aspect('equal')
plt.show()



In [ ]: