Studio/Gallery/DLA

From J Wiki
Jump to: navigation, search

The following is a simple attempt at implementing DLA. From the style of the code, looks like it was largely lifted from an implementation in a non-array-oriented language.

For an example of modifying this code to make it more J-like, look here and here.

Diffusion-Limited Aggregation

1) On a 2 Dimensional lattice place "seed" particles, usually a single point in the center of the lattice.

2) Release particles on the lattice, which will commence randomly walk the lattice until the particle either:

a) wanders outside of the bounds established and the particle is then disposed off OR.. b) bumps into an occupied point in the lattice, and sticks to become part of a growing cluster

3) And then release a new particle and repeat step (2)

Dla polar.png

A DLA cluster generated with J601 and rendered with viewmat.

Here is the J601 code I have been working with.

load 'coutil'
cocurrent 'dla'

NB. State settings
size =: 0 NB.Keep track of the size of the cluster
nbs =: 1 1j1 0j1 _1j1 _1 _1j_1 0j_1 1j_1 NB. Neighbors to a point in complex numbers
space =: 500 500 $ 0                     NB. Lattice to grow the cluster

NB. Operations and helpers
getCenter =: (j./) @ ( -: @ $)         NB. Get the center of the lattice
seed =: 3 : '1 (< +. getCenter y) } y' NB. place a single point in the center of lattice
csign =: (+.^:_1) @ ( * @ +.)          NB. get the 'sign' of a complex number i.e 0.25j_0.5 -> 1j_1
walk =: 3 : 'y + (? # nbs) { nbs'      NB. Simple form of random walk
walk2 =: 3 : 'y + (? 1 +  # nbs) { nbs, csign center - y' NB. Baised toward center of lattice
NB. Used to calculate the max radius of the cluster
dist =: 4 : 0
	d =:(0 { *. (x - y))
	>.(size >. d )
)
NB. release a new particle distance x + 5 from center y
release =: 4 : 0
	r =. (x + 5) r. (2p1 * ? 0)
	<. r + y
)
add_to_cluster =: 3 : 0
	space =: 1 (< +. y) } space
)
NB. This probably could be improved. Used to find if a point has landed on the cluster
NB. Look at the 8 neighbors around a point and see if there are any occupied cells.
range =: <:,],>:
drange =: (range@(0&{@+.)); (range@(1&{@+.))
check_collision =: 3 : '+/+/(< drange y) { space'
NB. Check to see if the point has wandered far away from the cluster.	
outOfBounds =: 4 : '(size + 10) <(0 { *. (x - y))'

NB. Init
center =: getCenter space
space =: seed space

NB. Process
grow =: 3 : 0
	c =. 0
	point =: size release center
	while. y > c do.
		point =: walk point
		if. point outOfBounds center do.
			point =: size release center
		else.
			if. check_collision point do.
				add_to_cluster point
				size =: center dist point
				break.
			end.
		end.
		c =. >: c
	end.
)

And here is how I typically use the module in a J session:

    load 'c:\j601\temp\cdla6.ijs'
    load 'viewmat'

    grow_dla_"0 (1000#1000)
1 2 2 2 3 3 3 3 4 4 4 4 4 4 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 ...
NB. List of steps till point reached the cluster
    +/ +/ space_dla_
1001 NB. Number of particles in the cluster
    viewmat space_dla_

Outline for this page's development:

1) Improve J code for generating DLA clusters (For some commentary on this code and some suggested revisions, look here.)

2) Show how different types of random walks and rules for detecting collisions can change the morphology of the cluster.

3) Put up pictures of different morphologies.

Mike Nardell