int baseUnit = 4; int baseGridPower = 2; int [][] grid; PFont font; Buttons [] button; void setup(){ size(550,400,P3D); font = loadFont("BitstreamVeraSans-Roman-48.vlw"); textFont(font,12); button = new Buttons[6]; button[0] = new Buttons(25,200,150,20,#FFFFFF,"Reset Grid",null); button[1] = new Buttons(25,220,150,20,#FFFFFF,"Increase Base Unit:"+baseUnit,null); button[2] = new Buttons(25,240,150,20,#FFFFFF,"Decrease Base Unit:"+baseUnit,null); button[3] = new Buttons(25,260,150,20,#FFFFFF,"Increase Grid Power:"+baseGridPower,null); button[4] = new Buttons(25,280,150,20,#FFFFFF,"Decrease Grid Power:"+baseGridPower,null); button[5] = new Buttons(25,300,150,20,#FFFFFF,"Add Numbers",null); grid = new int[2][]; grid[0] = new int[int(pow(baseUnit,baseGridPower))]; grid[1] = new int[int(pow(baseUnit,baseGridPower+2))]; for(int j = 0; j < grid[0].length; j++){ grid[0][j] = 0; } for(int j = 0; j < grid[1].length; j++){ grid[1][j] = int(random(4)); } } void draw(){ background(50); drawGrid(0,50,50,100,100); drawGrid(1,200,50,300,300); for (int i = 0; i < button.length; i++){ button[i].draw(); } } void mousePressed(){ int choice = -1; for (int i = 0; i < button.length; i++){ if(button[i].over()){ choice = i; } } switch(choice){ case 0: resetGrid(); break; case 1: baseUnit = (baseUnit+1)%7; button[1].label = "Increase Base Unit:"+baseUnit; button[2].label = "Decrease Base Unit:"+baseUnit; resetGrid(); break; case 2: baseUnit--; if (baseUnit < 0) baseUnit = 0; button[1].label = "Increase Base Unit:"+baseUnit; button[2].label = "Decrease Base Unit:"+baseUnit; resetGrid(); break; case 3: baseGridPower = (baseGridPower+1)%7; if(baseGridPower > 1 && (baseGridPower>>1)<<1 != baseGridPower){ //doesn't like odd powers so I have to skip them baseGridPower++; } button[3].label = "Increase Grid Power:"+baseGridPower; button[4].label = "Decrease Grid Power:"+baseGridPower; resetGrid(); break; case 4: baseGridPower--; if(baseGridPower > 1 && (baseGridPower>>1)<<1 != baseGridPower){ baseGridPower--; } if (baseGridPower < 0) baseGridPower = 0; button[3].label = "Increase Grid Power:"+baseGridPower; button[4].label = "Decrease Grid Power:"+baseGridPower; resetGrid(); break; case 5: upload(0); break; } } void resetGrid(){ grid = new int[2][]; grid[0] = new int[int(pow(baseUnit,baseGridPower))]; grid[1] = new int[int(pow(baseUnit,baseGridPower+2))]; for(int j = 0; j < grid[0].length; j++){ grid[0][j] = 0; } for(int j = 0; j < grid[1].length; j++){ grid[1][j] = int(random(4)); } } void upload(int i){ //loads values from a larger grid to a smaller grid //readLength is included in case reading blocks are smaller that root of baseLength (as in neural net layers) int readLength = baseUnit; int baseLength = int(sqrt(grid[i].length)); int sourceLength = int(sqrt(grid[i+1].length)); for (int j = 0; j < grid[i].length; j++){ int sourceStart = ((j % baseLength) * readLength) + (((j / baseLength) * readLength) * sourceLength); int sourceEnd = sourceStart+(sourceLength*readLength); for (int k = sourceStart; k < sourceEnd; k += sourceLength){ for (int m = 0; m < readLength; m++){ //println(k+m); grid[i][j] += grid[i+1][k+m]; } } //println("coda"); } } void drawGrid(int gridNumber, float x, float y, float w, float h){ //draws a matrix stored linearly as a grid int sideLength = int(sqrt(grid[gridNumber].length)); float xStep = w/sideLength; float yStep = h/sideLength; fill(255); stroke(255,0,0); for(int i = 0; i < sideLength; i++){ line(x,y+(yStep*i),x+(w-xStep),y+(yStep*i)); } for(int i = 0; i < sideLength; i++){ line(x+(xStep*i),y,x+(xStep*i),y+(h-yStep)); } for(int i = 0; i < sideLength; i++){ for(int j = 0; j < sideLength; j++){ text(grid[gridNumber][i+j*sideLength],x+(xStep*i),y+(yStep*j)); } } }