Game of Life, introducing gray
During the last hour I modified my previous version of Game Of life trying to reproduce the same behavior using an analogic discriminator. Instead of counting the number of neighbours I elaborate their medium color and use this value to decide the next rgb combination of the cell.
In the following snippet the two versions (classic and analogic) are compared:
// Classic version:
void compute(){
int black_neighbours = 0;
for(int z=0; z < neighbours.length; z++)
if(neighbours[z].rgb == black)
black_neighbours ++;
switch(black_neighbours){
case 0:
case 1:
case 4:
case 5:
case 6:
case 7:
case 8:
to_color(white);
break;
case 2:
to_color(rgb);
break;
case 3:
to_color(black);
break;
}
}
// Analogic version
void compute(){
int[] medium_color = new int[] {0,0,0};
for(int z=0; z < neighbours.length; z++)
for(int c=0; c < 3; c++)
medium_color[c] = medium_color[c] + neighbours[z].rgb[c];
int medium_tone = 0;
for(int c=0; c < 3; c++){
medium_color[c] = medium_color[c] / neighbours.length;
medium_tone = medium_tone + medium_color[c];
}
medium_tone = medium_tone / 3;
if (medium_tone > 191 || medium_tone < 128 ){
to_color(white);
}else if(medium_tone > 159 ){
to_color(rgb);
}else{
to_color(black);
}
}
Next I went a step further using ‘medium color’ when the classic rules asked insted to keep the previous cell color. This lead to a general acceleration to white because the medium neighbours color is always more bright than pure black, to balance this behavior I expanded the range of medium_tones which results in black. Here’s the tuned code:
void compute(){
int[] medium_color = new int[] {0,0,0};
for(int z=0; z < neighbours.length; z++)
for(int c=0; c < 3; c++)
medium_color[c] = medium_color[c] + neighbours[z].rgb[c];
int medium_tone = 0;
for(int c=0; c < 3; c++){
medium_color[c] = medium_color[c] / neighbours.length;
medium_tone = medium_tone + medium_color[c];
}
medium_tone = medium_tone / 3;
if (medium_tone > 191 || medium_tone < 80 ){
to_color(white);
}else if(medium_tone > 159 ){
to_color(medium_color);
}else{
to_color(black);
}
}
Now a short video of this new behavior:
Tags: cellular automata, game of life, Processing