User:Devon McCormick/DLA/cdla6Revised0.ijs
Jump to navigation
Jump to search
Referenced in this explanation and demonstration of performance timings.
NB.* cdla6Revised0.ijs: Diffusion-limited aggregation from NB. http://www.jsoftware.com/jwiki/Studio/Gallery/DLA as initially revised. load 'coutil' cocurrent 'dla' NB.* grow: grow cluster by random DLA, one point at a time. grow=: 3 : 0 c=. 0 point=: SZ release CTR while. y > c do. point=: walk point if. (point outOfBounds CTR)+.check_oob point do. point=: SZ release CTR else. if. check_collision point do. add_to_cluster point SZ=: CTR dist point break. end. end. c=. >: c end. c ) NB. State settings: set globals, initialize grid. SZ=: 0 NB.* SZ: Track maximum extent of the cluster NB.* NBS: Neighboring points as complex numbers NBS=: 1 1j1 0j1 _1j1 _1 _1j_1 0j_1 1j_1 SPC=: (3 : '1 (<<.-:$y) }y') 1000 1000$0 NB.* SPC: seed lattice in center. CTR=: (3 : 'j./<.-:$y') SPC NB.* CTR: center point of lattice. NB.* walk: Simple form of random walk: one-step. walk=: 3 : 'y+(?#NBS){NBS' NB.* dist: Calculate the max radius of the cluster dist=: 4 : '>.SZ>.0{*.x-y' NB.* release: Release a new particle distance x + 5 from center y release=: 4 : '<.y+(x+5) r. 2p1*?0' NB.* add_to_cluster: add point to cluster. add_to_cluster=: 3 : 'SPC=: 1 (<+.y) } SPC' NB. This probably could be improved: finds if point has landed on cluster by NB. looking at the its 8 neighbors to see if there are any occupied cells. NB.* check_collision: check if point within 1 cell of another point. check_collision=: 3 : '1 e. ,(<([:<"1[: ]_1 0 1 +/~+.) y) { SPC' NB.* check_oob: Check if point close to out-of-bounds (within 1 of any edge). check_oob=: 13 : '(2+./ . >:y)+. y+./ . >:$SPC [ y=. >:+.y' NB.* outOfBounds: Check if point has wandered far away from cluster. outOfBounds=: 4 : '(SZ+10)<0{*.x-y'