Przejdź do treści

kapalka.psor24.eu

Strona internetowa Michała Kapałki

  • Dydaktyka
  • CMS
  • Symulacja
  • Prywatnie

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:

O autorze

Od 2008 roku pracuję jako asystent naukowo-dydaktyczny w Wojskowej Akademii Technicznej.

Pracuję na wydziale Cybernetyki,  w Instytucie Systemów Informatycznych (link - do mojej strony na stronie Instytutu w którym pracuję).
W dziale Dydaktyka studenci (choć nie tylko) mogą znaleźć materiały związane z przedmiotami które prowadzę.

Jestem informatykiem, zawodowo zajmuję się projektowaniem i wdrażaniem rozwiązań w oparciu o system zarządzania treścią Drupal.

Pracuję jako: webdeveloper, freelancer, manager (w grupie freelancerskiej takectrl.eu). Z uwagi na to zajęcie, nie są mi obce zagadnienia związane z nowoczesnymi technologiami www.

© Michał Kapałka 2007-2018,
Developed by takectrl.eu