niedziela, 5 lutego 2017

Rozbudowa automatu 2D

Teraz rozbudujemy nasz dwuwymiarowy automat komórkowy tak, żeby zabawa była ciekawsza ;-)
Przy okazji porównamy szybkości naszych komputerów.
Na początek zmiany w setupie:
  • Po pierwsze zwiększamy tablice, żeby automat miał więcej miejsca na rozwój. Tą liczbę warto lekko tuningować (zwiększając lub zmniejszając małe liczby) ponieważ każde ustawienie automatu ma swoją naturalną szerokość i jeśli obwód torusa (jakim jest świat naszego automatu) pokryje się z naturalną szerokością, to wynik będzie wyglądał tak jak w przestrzeni "nieskończonej".
  • Po drugie dodajemy zmienne Div i self, analogicznie do tego co robiliśmy w jednowymiarowej implementacji reguły modulo. 
  • Po trzecie poprawiamy losowanie (linia 24), dopasowując je do istnienia zmiennej Div. Musimy użyć rzutowania na (int) bo wynik funkcji random() w Processingu jest typu float co może niemile zaskakiwać osoby przyzwyczajone do C/C++ czy Pascala.
  • Możecie też sprawdzić co by było gdyby wykomentować linię 16. U mnie efekt jest fatalny - odblokowanie antyaliasingu bardzo spowalnia program, nie mówiąc już o tym, że dla automatu komórkowego jest to jedynie źródło artefaktów graficznych.
Przejdźmy teraz do zmian w procedurze draw():
Tu też mamy kilka zmian, choć raczej kosmetycznych.
  1. W pętli zmiany stanu automatu (linie 55-75) używamy nowych zmiennych Div i self. Div służy oczywiście jako dzielnik operacji modulo (linia 73) a self pozwala zadecydować czy aktualny stan komórki ma/nie ma wpływu na stan następny za pomocą znanej nam już operacji ?:   (linia 66).
  2. W pętli rysującej dodaliśmy kolejne możliwe kolory konturów i pikseli (linie 42 i 43)
  3. Napis w numerem kroku przesunęliśmy na dół okna zmieniając współrzędną y na wartość WorldSize. Uzupełniliśmy go też o wartość definiowanej przez Processing zmiennej frameRate, która podaje realną wydajność programu w postaci średniej liczby klatek na sekundę.

Ustawiając w procedurze setup() dużą wartość frameRate() wymuszamy na Processingu maksymalny "wysiłek", ale nie mamy żadnej gwarancji że realna liczba klatek będzie choćby zbliżona. W końcu tej roboty jest całkiem sporo - narysowanie każdego punktu to wywołanie procedury point(), a tych wywołań jest ponad ćwierć miliona na klatkę obrazu!
Zresztą sami zobaczcie i podzielcie się informacją w komentarzach na blogu.

Dla Dens=0.1 efekt graficzny nie będzie zbyt ciekawy, za to wynik liczby klatek na sekundę maksymalnie miarodajny.
Dla dalszych prac proponuję jednak wrócić do inicjowania pojedynczą komórką i pomanipulować parametrami modelu self, Div i WorldSize





Brak komentarzy:

Prześlij komentarz