CA ca; public int rows; public int cols; public int res; float offset; int[][] board; void setup() { size(800, 800); frameRate(30); background(255); res = 1; rows = (int)(height/res); cols = (int)(width/res); offset = res/2; ca = new CA(); board = new int[cols][rows]; for (int x = 0; x < cols; x++) { for (int y = 0; y < rows; y++) { board[x][y] = (int)random(2); } } } void draw() { //background(255); //ca.display(); //ca.generate(); noStroke(); for (int x = 0; x < cols; x+= 1) { for (int y = 0; y < rows; y+= 1) { if (board[x][y] == 1) fill(0); else fill(255); rect(x*res, y*res, res, res); } } computeNextGeneration(); } void computeNextGeneration() { int[][] nextBoard = new int[cols][rows]; for (int x = 1; x < cols-1; x++) { for (int y = 1; y < rows-1; y++) { int n = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { n += board[x+i][x+j]; } } n-= board[x][y]; if (board[x][y] == 1 && n < 2) nextBoard[x][y] = 0; else if (board[x][y] == 1 && n > 6) nextBoard[x][y] = 1; else if (board[x][y] == 0 && n == 6) nextBoard[x][y] = 1; else nextBoard[x][y] = board[x][y]; } } board = nextBoard; } void mousePressed(){ saveFrame("noise-####.png"); setup(); } class CA { int[] cells; int[] ruleset; int generation; CA() { cells = new int[cols]; ruleset = new int[8]; ruleset[0] = 0; ruleset[1] = 1; ruleset[2] = 0; ruleset[3] = 1; ruleset[4] = 1; ruleset[5] = 0; ruleset[6] = 1; ruleset[7] = 0; for (int i = 0; i < cells.length; i++) { cells[i] = (int)random(2); } cells[cells.length/2] = 1; generation = 0; } void generate() { int[] newcells = new int[cells.length]; for (int i = 1; i < cells.length-1; i++) { int left = cells[i-1]; int middle = cells[i]; int right = cells[i+1]; int newstate = rule(left, middle, right); newcells[i] = newstate; } cells = newcells; generation++; if(generation > width/res) generation = 0; } int rule(int l, int m, int r) { String s = ""+l+m+r; int index = Integer.parseInt(s, 2); return ruleset[index]; } void display() { for (int i = 0; i < cells.length; i++) { if (cells[i] == 0) fill(255, 20); else fill(0, 20); noStroke(); rect(i*res, generation*res, res, res); } } }