Diffusion-limited aggregation (DLA)

Ten wpis poświęcam symulacji "agregacji cząstek" poruszających się w otoczeniu 2D. Co do samych zasad to nie będę powielał informacji zapraszam tutaj: Diffusion-limited aggregation (DLA). Zasady ruchu cząstek w mojej symulacji są następujące:
- cząstki poruszają się w przestrzeni 2D o kształcie kwadratu
- położenie początkowe każdej cząstki jest losowe
- liczba cząstek jak i rozmiar przestrzeni może być dowolny (ograniczony mocą maszyny wykonującej obliczenia)
- cząstki poruszają się w sposób losowy
- jedna losowa cząstka jest nieruchoma (daje początek "agregatowi")
- jeśli jakakolwiek poruszająca się cząstka znajdzie się w pobliżu agregatu - przestaje się poruszać i sama staje się częścią "agregatu"
Sam symulator zaimplementowałem w javie, dodałem możliwość wykonywania wielu eksperymentów jednocześnie. Poniżej fragmenty kodu związane z (DLA):
Przestrzeń reprezentowane przez macierz:
public boolean[][] ground;
Funkcja określająca kolejny ruch cząstki. Zwracana wartość określa czy cząstka przestaje się poruczać w kolejnym kroku czy nie:
public boolean nextStep(){
do{x=this.X+((rand.nextBoolean()) ? 1 :-1);}while(x<1 || x>env.sizeX-2);
this.X=x;
do{y=this.Y+((rand.nextBoolean()) ? 1 :-1);}while(y<1 || y>env.sizeY-2);
this.Y=y;
body.setBounds(
(float)(env.X* MCanvas.gridSpacing+X*env.scale),
(float)(env.Y* MCanvas.gridSpacing+Y*env.scale),
(float)env.scale,
(float)env.scale);
if(!env.ground[this.X][this.Y]){
env.ground[this.X-1][this.Y-1]=false;
env.ground[this.X][this.Y-1]=false;
env.ground[this.X+1][this.Y-1]=false;
env.ground[this.X+1][this.Y]=false;
env.ground[this.X][this.Y]=false;
env.ground[this.X-1][this.Y+1]=false;
env.ground[this.X][this.Y+1]=false;
env.ground[this.X+1][this.Y+1]=false;
body.setPaint(Color.RED);
return true;
}
return false;
}
Poniżej krótki film pokazujący przebieg symulacji dla jednego eksperymentu:
I kolejny z serią eksperymentów uruchomionych równocześnie: