torch [] t; boolean [][][][][] pix; int xm = 30; int ym = 30; int zm = 30; int tm = 30; int rm = 30; int tf = 10; int rf = 10; int flow = 1; void setup(){ pix = new boolean [rm][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++){ for (int ir = 0; ir < rm; ir++){ pix [ir][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(rm-2))+1,int(random(4))); } } void loop(){ background(255); push(); translate(200,200,290); 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 } cubeHSB(); //rotateX(PI); strokeWeight(4); drawCube(tf,rf); pop(); flowDisplay(); tf += flow; if (keyPressed && key == '+'){ flow ++; if (flow > 1){ flow = 1; } } if (keyPressed && key == '-'){ flow --; if (flow < -1){ flow = -1; } } if (keyPressed && key == '1'){ rf ++; if (rf > rm-2){ rf = 2; } } if (keyPressed && key == '0'){ rf --; if (rf < 2){ rf = rm-2; } } if (tf > tm - 2){ tf = 2; } if (tf < 2){ tf = tm - 2; } } //debugging cube void drawCube(int it, int ir){ colorMode(HSB); stroke((255.0/rm)*ir,255,200); 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[ir][it][ix][iy][iz]) point(ix-(xm/2),iy-(ym/2),iz-(zm/2)); } } } }//draw; //render boundaries void flowDisplay(){ colorMode(RGB); strokeWeight(1); stroke(0,0,255); rect(200-(tm/2),0,tm,10); stroke(0); line(200-(tm/2)+tf,0,200-(tm/2)+tf,10); } void cubeHSB(){ strokeWeight(1); colorMode(HSB); stroke((255.0/rm)*rf,255,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 [] r; int d,len,le; torch(int x, int y, int z, int t, int r, 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.r = 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; this.r[i] = r; } } void trace(){ int xp = x[le]; int yp = y[le]; int zp = z[le]; int tp = t[le]; int rp = r[le]; //println(xp+" "+yp+" "+zp); boolean c = pix[rp][tp][xp][yp][zp]; pix[rp][tp][xp][yp][zp] = true; if (d == 0 && !pix[rp][tp][xp+1][yp][zp]){x[le]++; }else if(d == 0 && pix[rp][tp][xp+1][yp][zp]){d = (d+1)%10; } if (d == 1 && !pix[rp][tp][xp][yp+1][zp]){y[le]++; }else if(d == 1 && pix[rp][tp][xp][yp+1][zp]){d = (d+1)%10; } if (d == 2 && !pix[rp][tp][xp][yp][zp+1]){z[le]++; }else if(d == 2 && pix[rp][tp][xp][yp][zp+1]){d = (d+1)%10; } if (d == 3 && !pix[rp][tp+1][xp][yp][zp]){t[le]++; }else if(d == 3 && pix[rp][tp+1][xp][yp][zp]){d = (d+1)%10; } if (d == 4 && !pix[rp+1][tp][xp][yp][zp]){r[le]++; }else if(d == 4 && pix[rp+1][tp][xp][yp][zp]){d = (d+1)%10; } if (d == 5 && !pix[rp][tp][xp-1][yp][zp]){x[le]--; }else if(d == 5 && pix[rp][tp][xp-1][yp][zp]){d = (d+1)%10; } if (d == 6 && !pix[rp][tp][xp][yp-1][zp]){y[le]--; }else if(d == 6 && pix[rp][tp][xp][yp-1][zp]){d = (d+1)%10; } if (d == 7 && !pix[rp][tp][xp][yp][zp-1]){z[le]--; }else if(d == 7 && pix[rp][tp][xp][yp][zp-1]){d = (d+1)%10; } if (d == 8 && !pix[rp][tp-1][xp][yp][zp]){t[le]--; }else if(d == 8 && pix[rp][tp-1][xp][yp][zp]){d = (d+1)%10; } if (d == 9 && !pix[rp-1][tp][xp][yp][zp]){r[le]--; }else if(d == 9 && pix[rp-1][tp][xp][yp][zp]){d = (d+1)%10; } 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;} if (r[le] > rm - 2){r[le] = 2;} if (r[le] < 2){r[le] = rm - 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]; r[i-1] = r[i]; } if(x[0] == x[1] && y[0] == y[1] && z[0] == z[1] && t[0] == t[1] && r[0] == r[1]){ pix[r[0]][t[0]][x[0]][y[0]][z[0]] = true; }else{ pix[r[0]][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 && r[i-1]==rf){ 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)); } } } } }