> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.w6bQtR2YX0I/rev.542
 * 
 * authors: 
 *   Gabriela Thumé
 *   Vilson Vieira
 *   

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



CA ca;

int tamanho = 600;

void setup() {
  size(600,400);
  frameRate(20);
  background(255);
  strokeWeight(0.4);
  int[] ruleset = {1,1,1,1,1,1,1,0};
  ca = new CA(ruleset);
}

void draw() {
  ca.render();
  ca.generate();  
//  if (ca.finished()) {
//    background(255);
    //ca.randomize();
    //ca.restart();
//  }
}

void mousePressed() {
  background(255);
  ca.randomize();
  ca.restart();
}

class CA {
  int[] cells; // linha de células
  int generation; // número da iteração
  int scl; // tamanho de cada célula
  int[] rules; // regras para o autômato celular

  CA(int[] r) {
    rules = r;
    scl = 10;
    cells = new int[tamanho/scl];
    restart();
  }
  
  CA() {
    scl = 10;
    cells = new int[tamanho/scl];
    randomize();
    restart();
  }
  
  int applyRules (int a, int b, int c) {
    if (a == 1 && b == 1 && c == 1) return rules[0];
    if (a == 1 && b == 1 && c == 0) return rules[1];
    if (a == 1 && b == 0 && c == 1) return rules[2];
    if (a == 1 && b == 0 && c == 0) return rules[3];
    if (a == 0 && b == 1 && c == 1) return rules[4];
    if (a == 0 && b == 1 && c == 0) return rules[5];
    if (a == 0 && b == 0 && c == 1) return rules[6];
    if (a == 0 && b == 0 && c == 0) return rules[7];
    return 0;
  }
  
  void setRules(int[] r) {
    rules = r;
  }
  
  void randomize() {
    for (int i = 0; i < 8; i++) {
      rules[i] = int(random(8));
    }
  }
  
  void restart() {
    for (int i = 0; i < cells.length; i++) {
      cells[i] = 0;
    }
    cells[cells.length/2] = 1;
    generation = 0;
  }

  void generate() {
    int[] nextgen = new int[cells.length];
    
    for (int i = 0; i < cells.length; i++) {
      int esquerda, atual, direita;
      
      // vizinho esquerda
      if(i==0){ 
        esquerda = cells[cells.length-1];
      }
      else{
        esquerda = cells[i-1];   
      }
      
      // estado corrente
      atual = cells[i];       
      
      // vizinha direita
      if(i==cells.length-1){ 
        direita = cells[0];
      }
      else{
          direita = cells[i+1]; 
      }
      
      // computa proxima geracao
      nextgen[i] = this.applyRules(esquerda,atual,direita); 
    }
    cells = nextgen;
    generation++;
  }
  
  void render() {
    for (int i = 0; i < cells.length; i++) {
      if (cells[i] == 1) {
          stroke(0);
          fill(255,0,0);
      } else if(cells[i]== 2){
          stroke(0);
          fill(0,255,0);
      } else if(cells[i]== 3){
          stroke(0);
          fill(200)
      }  else if(cells[i]== 4){
          stroke(0);
          fill(255,255,0)
      }  else if(cells[i]== 5){
          stroke(0);
          fill(0,255,255)
      }  else if(cells[i]== 6){
          stroke(0);
          fill(150)
      } else {
          stroke(0);
          fill(0,0,255);
      }
      rect(i*scl,generation*scl, scl,scl);
    }
  }
  
  boolean finished() {
    if (generation > height/scl) {
       return true;
    } else {
       return false;
    }
  }
}