torch [] t; boolean [][][][] pix; int xm = 50; int ym = 50; int zm = 50; int tm = 50; int tf = 25; int flow = 1; void setup(){ pix = new boolean [tm][xm][ym][zm]; for (int ix = 0; ix < xm; ix++){ for (int iy = 0; iy < ym; iy++){ for (int iz = 0; iz < zm; iz++){ for (int it = 0; it < tm; it++){ pix [it][ix][iy][iz] = false; } } } } framerate(12); noFill(); size (400,400); t = new torch[50]; for (int i = 0; i < t.length; i++){ //t[i]=new torch(25,25,25,0); t[i] = new torch(int(random(xm-2))+1,int(random(ym-2))+1,int(random(zm-2))+1,int(random(tm-2))+1,int(random(4))); } } void loop(){ background(255); push(); translate(200,200,250); rotateY((TWO_PI/width)*mouseX); rotateZ((TWO_PI/width)*mouseY); for (int i = 0; i < t.length; i++){ t[i].trace(); t[i].draw(); //for trails } cubeBlue(); //rotateX(PI); strokeWeight(3); drawCube(tf); pop(); flowDisplay(); tf += flow; if (keyPressed && key == '+'){ flow ++; if (flow > 1){ flow = 1; } } if (keyPressed && key == '-'){ flow --; if (flow < -1){ flow = -1; } } if (tf > tm - 2){ tf = 2; } if (tf < 2){ tf = tm - 2; } } //debugging cube void drawCube(int it){ stroke(0); for (int ix = 1; ix < xm-1; ix++){ for (int iy = 1; iy < ym-1; iy++){ for (int iz = 1; iz < zm-1; iz++){ if(pix[it][ix][iy][iz]) point(ix-(xm/2),iy-(ym/2),iz-(zm/2)); } } } }//draw; //render boundaries void flowDisplay(){ strokeWeight(1); stroke(0,0,100); rect(175,0,50,10); stroke(0); line(175+tf,0,175+tf,10); } void cubeBlue(){ strokeWeight(1); stroke(20,20,255,100); line(-(xm/2),-(ym/2),-(zm/2),(xm/2),-(ym/2),-(zm/2)); line(-(xm/2),-(ym/2),-(zm/2),-(xm/2),(ym/2),-(zm/2)); line(-(xm/2),-(ym/2),-(zm/2),-(xm/2),-(ym/2),(zm/2)); line((xm/2),-(ym/2),-(zm/2),(xm/2),(ym/2),-(zm/2)); line((xm/2),-(ym/2),-(zm/2),(xm/2),-(ym/2),(zm/2)); line(-(xm/2),(ym/2),-(zm/2),(xm/2),(ym/2),-(zm/2)); line(-(xm/2),-(ym/2),(zm/2),(xm/2),-(ym/2),(zm/2)); line(-(xm/2),-(ym/2),(zm/2),-(xm/2),(ym/2),(zm/2)); line(-(xm/2),(ym/2),(zm/2),(xm/2),(ym/2),(zm/2)); line(-(xm/2),(ym/2),(zm/2),-(xm/2),(ym/2),-(zm/2)); line((xm/2),(ym/2),(zm/2),(xm/2),(ym/2),-(zm/2)); line((xm/2),(ym/2),(zm/2),(xm/2),-(ym/2),(zm/2)); } class torch{ int [] x; int [] y; int [] z; int [] t; int d,len,le; torch(int x, int y, int z, int t, int d){ len = 2; le = len-1; this.x = new int [len]; this.y = new int [len]; this.z = new int [len]; this.t = new int [len]; this.d = d; for (int i = 0; i < len; i++){ this.x[i] = x; this.y[i] = y; this.z[i] = z; this.t[i] = t; } } void trace(){ int xp = x[le]; int yp = y[le]; int zp = z[le]; int tp = t[le]; //println(xp+" "+yp+" "+zp); boolean c = pix[tp][xp][yp][zp]; pix[tp][xp][yp][zp] = true; if (d == 0 && !pix[tp][xp+1][yp][zp]){x[le]++; }else if(d == 0 && pix[tp][xp+1][yp][zp]){d = (d+1)%8;} if (d == 1 && !pix[tp][xp][yp+1][zp]){y[le]++; }else if(d == 1 && pix[tp][xp][yp+1][zp]){d = (d+1)%8;} if (d == 2 && !pix[tp][xp][yp][zp+1]){z[le]++; }else if(d == 2 && pix[tp][xp][yp][zp+1]){d = (d+1)%8;} if (d == 3 && !pix[tp+1][xp][yp][zp]){t[le]++; }else if(d == 3 && pix[tp+1][xp][yp][zp]){d = (d+1)%8;} if (d == 4 && !pix[tp][xp-1][yp][zp]){x[le]--; }else if(d == 4 && pix[tp][xp-1][yp][zp]){d = (d+1)%8;} if (d == 5 && !pix[tp][xp][yp-1][zp]){y[le]--; }else if(d == 5 && pix[tp][xp][yp-1][zp]){d = (d+1)%8;} if (d == 6 && !pix[tp][xp][yp][zp-1]){z[le]--; }else if(d == 6 && pix[tp][xp][yp][zp-1]){d = (d+1)%8;} if (d == 7 && !pix[tp-1][xp][yp][zp]){t[le]--; }else if(d == 7 && pix[tp-1][xp][yp][zp]){d = (d+1)%8;} if (x[le] > xm - 2){x[le] = 2;} if (x[le] < 2){x[le] = xm - 2;} if (y[le] > ym - 2){y[le] = 2;} if (y[le] < 2){y[le] = ym - 2;} if (z[le] > zm - 2){z[le] = 2;} if (z[le] < 2){z[le] = zm - 2;} if (t[le] > tm - 2){t[le] = 2;} if (t[le] < 2){t[le] = tm - 2;} //pix[xp][yp][zp] = c; for (int i = 1; i < len; i++){ x[i-1] = x[i]; y[i-1] = y[i]; z[i-1] = z[i]; t[i-1] = t[i]; } if(x[0] == x[1] && y[0] == y[1] && z[0] == z[1] && t[0] == t[1]){ pix[t[0]][x[0]][y[0]][z[0]] = true; }else{ pix[t[0]][x[0]][y[0]][z[0]] = true;//set to false for trails } } //draw trails void draw (){ for (int i = 1; i < len; i++){ if(t[i-1] == tf){ if (abs(x[i-1]-x[i])<2 && abs(y[i-1]-y[i])<2 && abs(z[i-1]-z[i])<2){ //stroke(((255.0)/le)*i,((255.0)/le)*i,((255.0)/le)*i,((255.0)/le)*i); //stroke((((155.0)/le)*i)+100,(((155.0)/le)*i)+100,255,((255.0)/le)*i); stroke(255); line(x[i-1]-(xm/2),y[i-1]-(ym/2),z[i-1]-(zm/2),x[i]-(xm/2),y[i]-(ym/2),z[i]-(zm/2)); } } } } }