sobota, 3 grudnia 2016

Błądzenie - ruchy Browna

Zaimplementujemy dzisiaj model stricte fizyczny - będą to dyfundujące cząsteczki. Jednak na początek zbadany pojedynczą cząstkę, dopiero potem przejdziemy do większej liczby.
Oto program na pojedynczą błądzącą cząsteczkę. Jest to uproszczenie jednej z wersji programu "Bila".
W linii 11. wyłączamy "wygładzanie", co nam zagwarantuje, że jeśli cząstka zniknie z ekranu w danym miejscu, to na dobre - nie pozostanie po niej żaden ślad. Jak już program będzie działał, możecie sprawdzić co by było, gdyby tą linię wykomentować.
Początkowe położenie cząstki to środek okna (linia 12.). Rysowanie w odcieniu szarości zależnym od licznika kroków count (zdefininiowanego w linii 17.) odbywa się na początku procedury draw().
Właściwy model, czyli zmiana położenia cząstki zaczyna się od linii 26.
Nie dokonujemy od razu przypisania na zmienne x i h, ale definiujemy dwie nowe zmienne newx i newh którym przypisujemy wartości obliczone jako poprzednie położenie zmodyfikowane o wartość losową z zakresu -maxd..maxd (linie 26. i 27.)>
Potem sprawdzamy czy wyliczone wartości nie są położeniem poza oknem i odpowiednio je modyfikujemy, a dopiero potem przypisujemy na zmienne x i h zmieniajac realnie położenie "cząsteczki".

Zmiana z jednej cząsteczki na wiele jest w zasadzie "kosmetyczna" ;-) (poniżej)
Zmienne x i h stają się jednowymiarowymi tablicami o rozmiarze Size mówiącym ile mamy jednocześnie cząsteczek w oknie.
Reszta zmian w kodzie jest prostą konsekwencją tego faktu:
 

 Wszystkie cząsteczki nie mogą być w jednym miejscu - w środku, stąd losujemy ich pozycje początkowe z zakresu 0..500 w pionie i w poziomie (linie 13..17).
Musimy też jakoś rozróżniać poszczególne cząsteczki, stąd uzależnienie koloru od indeksu cząsteczki przy wyświetlaniu (linia 27.).

W warunkach ograniczania "pudełka" nie musimy nic zmieniać, jedynie przypisania w liniach 59. i 60. W tej wersji jednak wędrujące cząsteczki pozostawiają za sobą ślad, co daje ciekawy efekt graficzny, ale szybko przestaje mieć cokolwiek wspólnego z procesem fizycznym, który mieliśmy modelować. Dlatego musimy poprzednie pozycje cząsteczek wygaszać kolorem tła (linie 55-60.)

Skoro jednak kompletna wizualizacja odbywa się na końcu pętli zmiany stanu, to osobnej pętli wizualizacyjnej z początku funkcji draw() możemy się już pozbyć.


Brak komentarzy:

Prześlij komentarz