Az 1*n méretű négyzetrácsos sejttéren, 2 állapotú, 2-es szomszédsággal
megvalósítható
automaták:
Vajon mennyivel lesz több szabályunk, ha a szomszédságot eggyel növeljük?
Mint ahogy az fentebb már látható, a szabályok száma finoman szólva is
drasztikusan
megugrik!
Egy 32 bites egész szám összes bitjére szükségünk lesz, hogy minden ilyen
autoamatát
megadhassunk.
Kettő jobb és kettő bal szomszéd + maga a sejt: 5 elem
Két állapot sejtenként: 0 vagy 1
=> 2^5 = 32 esetre kell megadnunk, hogy a következő generációban a
vizsgált sejt
helyén
0-s
vagy
1-es
legyen, így esetenként megint 2-2 opciónk van.
(2^5)^2 = 2^32 = 2147483647
Összesen 2147483647 szabállyal adható meg minden ilyen autómata
működése.
Az egymást követő generációkat megint egymás alá rajzoljuk, így marad az
1 tér(x) + 1 idő(y) dimenzió.
Az előző kód egy kis módosítással képes lesz a 2-es szomszédságú automaták
szimulálására is:
void iterate2() { // A következő generáció
int[] cells2 = new int[cellsPerRow];
cells2[0] = (RULE >> (cells[0] * 4 + cells[1] * 8 + cells[2] * 16)) & 1;
cells2[1] =
(RULE >> (cells[0] * 2 + cells[1] * 4 + cells[2] * 8 + cells[3] * 16)) & 1;
cells2[cellsPerRow-1] =
(RULE >> (cells[cellsPerRow-3] * 1 + cells[cellsPerRow-2] * 2 + cells[cellsPerRow-1] * 4)) & 1;
cells2[cellsPerRow-2] =
(RULE >> (cells[cellsPerRow-4] * 1 + cells[cellsPerRow-3] * 2 + cells[cellsPerRow-2] * 4 + cells[cellsPerRow-1] * 8)) & 1;
for (int i = 2; i < cellsPerRow - 2; i++) {
cells2[i] = (RULE >> (cells[i-2] * 1 + cells[i-1] * 2 + cells[i] * 4 + cells[i+1] * 8 + cells[i+2] * 16)) & 1;
}
for (int i = 0; i < cellsPerRow; i++)
cells[i] = cells2[i];
}
A setup() metódusban hívjuk meg az iretare2() függvényt az
itarate()
helyett.
// A képernyő kitöltése
for(int i = 0; i < height / side; i++) {
drawCells(i, side);
iterate2();
}
Ezen a ponton már érdemes lenne nem manuálisan módosítani a RULE változó
értékét.
Sorsoljuk
egy
véletlen
szabályt!
- Importáljuk be a Random osztályt a következő sor beillesztésével a
kódunk
tetejére:
Random rand = new Random();
-
Adjunk hozzá a projekthez egy üres draw() metódust, hogy annak futása
ne álljon le egy szabály rajzolása után!
void draw() {}
-
A következő metódus megírásával kössük össze mondjuk az R billentyű
lenyomását egy véletlenszerű szabály kisorsolásával és megjelenítésével!
void keyPressed() {
if (key == 'r' || key == 'R')
RULE = rand.nextInt();
println(RULE);
setup();
}
Így kaphatunk akár ilyen részletekben és mintákban gazdag képeket: