// begin of class CUBE ******************************************************************** class CUBE { boolean activity; boolean aliveness = false; int layer, h_line, v_line; int a, b, c, d, h, mother_rule = -1; int [][] neighbours = new int [8][8]; int [][] points = new int [1][3]; int [] aliveness_species = new int [2]; int species = 0; int generation_age = 0; color [] g_age = new color[5]; CUBE (int h_layer, int h_h_line, int h_v_line, boolean ac) { activity=ac; if (ac) objects++; layer = h_layer; h_line = h_h_line; v_line = h_v_line; points[0][0] = h_line*gridsize; points[0][1] = v_line*gridsize; points[0][2] = layer*gridsize; clarify_motherrule(); } // end of CUBE // methods of game of of life void set_species(int sp) { species = sp; } int [] get_aliveness() { if (aliveness) { aliveness_species[0] = 1; } else { aliveness_species[0] = 0; } aliveness_species[1] = species; return aliveness_species; } void set_aliveness(boolean al) { // if a living cell is reborn get older in gernerationg age if (al && aliveness) { generation_age++; } // if a new cell is born set delete generation age else { generation_age=0; } // kill cell wich are to old (here 60 genarations) if (generation_age >= 60 && autokill) { aliveness = false; } // let the cell live or die after the rules of the game of life else { aliveness = al; clarify_motherrule(); } } // methods of CUBE ........................................................................ void clarify_motherrule() { if (activity) { if (layer == 0) { mother_rule = 0; } else { int l0 = layer-1; int i0 = h_line-1; int i1 = h_line; int i2 = h_line+1; int j0 = v_line-1; int j1 = v_line; int j2 = v_line+1; //finite layer understaning (flip at the border to get the neighbours on the other side) if (h_line==0) { i0 = grid_abs/gridsize-1; } if (h_line==grid_abs/gridsize-1) { i2 = 0; } if (v_line==0) { j0 = grid_abs/gridsize-1; } if (v_line==grid_abs/gridsize-1) { j2 = 0; } a = cubes[l0][i1][j0].get_activity(); b = cubes[l0][i2][j1].get_activity(); c = cubes[l0][i1][j2].get_activity(); d = cubes[l0][i0][j1].get_activity(); if (a == 1 && b == 1 && c == 1 && d == 1) mother_rule = 1; else if (a == 1 && b == 1 && c == 1 && d == 0) mother_rule = 2; else if (a == 1 && b == 1 && c == 0 && d == 1) mother_rule = 3; else if (a == 1 && b == 1 && c == 0 && d == 0) mother_rule = 4; else if (a == 1 && b == 0 && c == 1 && d == 1) mother_rule = 5; else if (a == 1 && b == 0 && c == 1 && d == 0) mother_rule = 6; else if (a == 1 && b == 0 && c == 0 && d == 1) mother_rule = 7; else if (a == 1 && b == 0 && c == 0 && d == 0) mother_rule = 8; else if (a == 0 && b == 1 && c == 1 && d == 1) mother_rule = 9; else if (a == 0 && b == 1 && c == 1 && d == 0) mother_rule = 10; else if (a == 0 && b == 1 && c == 0 && d == 1) mother_rule = 11; else if (a == 0 && b == 1 && c == 0 && d == 0) mother_rule = 12; else if (a == 0 && b == 0 && c == 1 && d == 1) mother_rule = 13; else if (a == 0 && b == 0 && c == 1 && d == 0) mother_rule = 14; else if (a == 0 && b == 0 && c == 0 && d == 1) mother_rule = 15; else if (a == 0 && b == 0 && c == 0 && d == 0) mother_rule = 16; } } } int get_activity() { if (activity) return 1; else return 0; } void set_activity(boolean ac) { activity = ac; } void show() { g_age[0] = color(0, 70, 250, h2_alpha); g_age[1] = color(200, 200, 0, h2_alpha); g_age[4] = color(5, 255, 255, h2_alpha); g_age[3] = color(25, 255, 25, h2_alpha); g_age[2] = color(200, 255, 5, h2_alpha); color g = color(120, 55, 255, h2_alpha); color g2 = color(0, 0, 255, h2_alpha); color g3 = color(0, 255, 100, h2_alpha); color c_org = color(100, h_alpha*.5); if (activity) { if (s) { noStroke(); c = c_org; if (vis) { c = color(160); } if (l) { stroke(90, 25, 185, h_alpha*.4); } if (s_rules) { if (mother_rule == ac_motherrule) { c = color(200, 0, 50, h2_alpha); } } else if (s_layers) { if (axis == 0 && layer == ac_layer) { c = color(200, 0, 50, h2_alpha); } else if (axis == 1 && h_line == ac_layer) { c = color(200, 0, 50, h2_alpha); } else if (axis == 2 && v_line == ac_layer) { c = color(200, 0, 50, h2_alpha); } } if (aliveness && gol) { if (species==0) { c = g; } else if (species==1) { c = g2; } else if (species==2) { c = g3; } if (show_livetime) { if (generation_age >= 5 && generation_age < 10) { c = g_age[0]; } else if (generation_age >= 10 && generation_age < 15) { c = g_age[1]; } else if (generation_age >= 15 && generation_age < 20) { c = g_age[2]; } else if (generation_age >= 20 && generation_age < 25) { c = g_age[3]; } else if (generation_age >= 25) { c = g_age[4]; } } } fill(c); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } else { if (s_rules) { if (mother_rule == ac_motherrule) { c = color(200, 0, 50, h2_alpha); noStroke(); fill(c); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } } if (s_layers) { if (axis == 0 && layer == ac_layer) { c = color(200, 0, 50, h2_alpha); noStroke(); fill(c); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } if (axis == 1 && h_line == ac_layer) { c = color(200, 0, 50, h2_alpha); noStroke(); fill(c); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } if (axis == 2 && v_line == ac_layer) { c = color(200, 0, 50, h2_alpha); noStroke(); fill(c); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } } if (l) { // oulines of the cubes stroke(90, 25, 185, h_alpha*.4); if (s_rules || s_layers) { stroke(60, h_alpha); } noFill(); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } if (gol && aliveness) { if (species==1) { g = g2; } else if (species==2) { g = g3; } if (show_livetime) { if (generation_age >= 5 && generation_age < 10) { g = g_age[0]; } else if (generation_age >= 10 && generation_age < 15) { g = g_age[1]; } else if (generation_age >= 15 && generation_age < 20) { g = g_age[2]; } else if (generation_age >= 20 && generation_age < 25) { g = g_age[3]; } else if (generation_age >= 25) { g = g_age[4]; } } noStroke(); fill(g); rectMode(CENTER); translate(points[0][0], points[0][1], points[0][2]); box(gridsize); translate(-points[0][0], -points[0][1], -points[0][2]); } } if (p) { stroke(40, 60); beginShape(POINTS); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]+gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]+gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize/2); endShape(); beginShape(POINTS); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]+gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]+gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize/2); endShape(); } } else { if (p_inactive) { stroke(20,60); beginShape(POINTS); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]+gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]+gridsize/2, points[0][2]-gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize/2); endShape(); beginShape(POINTS); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]+gridsize/2, points[0][1]+gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]+gridsize/2, points[0][2]+gridsize/2); vertex(points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize/2); endShape(); } } if (show_d) { // space grid stroke(50,0,70, 25); // x-axis if (h_line==0) { line ( points[0][0]-gridsize, points[0][1]-gridsize/2, points[0][2]-gridsize/2, points[0][0]-gridsize-500, points[0][1]-gridsize/2, points[0][2]-gridsize/2); line ( points[0][0]-gridsize, points[0][1]-gridsize/2, points[0][2]+gridsize/2, points[0][0]-gridsize-500, points[0][1]-gridsize/2, points[0][2]-gridsize/2); } if (h_line==grid_abs/gridsize-1) { line ( points[0][0]+gridsize, points[0][1]-gridsize/2, points[0][2]-gridsize/2, points[0][0]+gridsize+500, points[0][1]-gridsize/2, points[0][2]-gridsize/2); line ( points[0][0]+gridsize, points[0][1]-gridsize/2, points[0][2]+gridsize/2, points[0][0]+gridsize+500, points[0][1]-gridsize/2, points[0][2]-gridsize/2); } // y-axis if (v_line==0) { line ( points[0][0]-gridsize/2, points[0][1]-gridsize, points[0][2]-gridsize/2, points[0][0]-gridsize/2, points[0][1]-gridsize-500, points[0][2]-gridsize/2); line ( points[0][0]-gridsize/2, points[0][1]-gridsize, points[0][2]+gridsize/2, points[0][0]-gridsize/2, points[0][1]-gridsize-500, points[0][2]-gridsize/2); } if (v_line==grid_abs/gridsize-1) { line ( points[0][0]-gridsize/2, points[0][1]+gridsize, points[0][2]-gridsize/2, points[0][0]-gridsize/2, points[0][1]+gridsize+500, points[0][2]-gridsize/2); line ( points[0][0]-gridsize/2, points[0][1]+gridsize, points[0][2]+gridsize/2, points[0][0]-gridsize/2, points[0][1]+gridsize+500, points[0][2]-gridsize/2); } // z-aixes if (layer==0) { line ( points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize, points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize-500); line ( points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize, points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]-gridsize-500); } if (layer == max_layers-1) { line ( points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize, points[0][0]-gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize+500); line ( points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize, points[0][0]+gridsize/2, points[0][1]-gridsize/2, points[0][2]+gridsize+500); } } } } // end of class CUBE ********************************************************************