boolean trails = true; torch [] t; boolean [][][][] pix; int xm = 30; int ym = 30; int zm = 30; int tm = 30; float hlx = 0.5; float hly = 0.5; float hlz = 0.5; 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(8))); } } void loop(){ background(255); push(); translate(200,200,275); rotateY((TWO_PI/width)*mouseX); rotateZ((TWO_PI/width)*mouseY); for (int i = 0; i < t.length; i++){ t[i].trace(); if (trails){ t[i].draw(); } //for trails } cubeBlue(); //rotateX(PI); strokeWeight(1); if (!trails){ drawCube(); } pop(); } void keyPressed(){ if (key == '4' && hlx < 0.5){ hlx += 0.05; } if (key == '1' && hlx > -0.5){ hlx -= 0.05; } if (key == '5' && hly < 0.5){ hly += 0.05; } if (key == '2' && hly > -0.5){ hly -= 0.05; } if (key == '6' && hlz < 0.5){ hlz += 0.05; } if (key == '3' && hlz > -0.5){ hlz -= 0.05; } } //debugging cube void drawCube(){ stroke(0); float dx = (tm/2)*hlx; float dy = (tm/2)*hly; float dz = (tm/2)*hlz; for (int ix = 1; ix < xm-1; ix++){ for (int iy = 1; iy < ym-1; iy++){ for (int iz = 1; iz < zm-1; iz++){ for (int it = 1; it < tm-1; it++){ if(pix[it][ix][iy][iz]) point(((ix-(xm/2))+(it*hlx))-dx,((iy-(ym/2))+(it*hly))-dy,((iz-(zm/2))+(it*hlz))-dz); } } } } }//draw; //render boundaries void mousePressed(){ trails = !trails; } void cubeBlue(){ strokeWeight(1); stroke(20,20,20,100); float dx = (tm/2)*hlx; float dy = (tm/2)*hly; float dz = (tm/2)*hlz; line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line((xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line((xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz,-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz,-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line((xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line((xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); dx = -(tm/2)*hlx; dy = -(tm/2)*hly; dz = -(tm/2)*hlz; line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line((xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line((xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz,-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz,-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line((xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz); line((xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz); line(-(xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,-(xm/2)-dx,-(ym/2)-dy,-(zm/2)-dz); line((xm/2)+dx,-(ym/2)+dy,-(zm/2)+dz,(xm/2)-dx,-(ym/2)-dy,-(zm/2)-dz); line((xm/2)+dx,(ym/2)+dy,-(zm/2)+dz,(xm/2)-dx,(ym/2)-dy,-(zm/2)-dz); line((xm/2)+dx,(ym/2)+dy,(zm/2)+dz,(xm/2)-dx,(ym/2)-dy,(zm/2)-dz); line((xm/2)+dx,-(ym/2)+dy,(zm/2)+dz,(xm/2)-dx,-(ym/2)-dy,(zm/2)-dz); line(-(xm/2)+dx,(ym/2)+dy,(zm/2)+dz,-(xm/2)-dx,(ym/2)-dy,(zm/2)-dz); line(-(xm/2)+dx,-(ym/2)+dy,(zm/2)+dz,-(xm/2)-dx,-(ym/2)-dy,(zm/2)-dz); line(-(xm/2)+dx,(ym/2)+dy,-(zm/2)+dz,-(xm/2)-dx,(ym/2)-dy,-(zm/2)-dz); } 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 = 500; 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]] = false;//set to false for trails } } //draw trails void draw (){ float dx = (tm/2)*hlx; float dy = (tm/2)*hly; float dz = (tm/2)*hlz; for (int i = 1; i < len; i++){ if (abs(x[i-1]-x[i])<2 && abs(y[i-1]-y[i])<2 && abs(z[i-1]-z[i])<2 && abs(t[i-1]-t[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-((((155.0)/le)*i)+100),255-((((155.0)/le)*i)+100),55,((255.0)/le)*i); line((x[i-1]-(xm/2))+(t[i-1]*hlx)-dx,(y[i-1]-(ym/2))+(t[i-1]*hly)-dy,(z[i-1]-(zm/2))+(t[i-1]*hlz)-dz, (x[i]-(xm/2))+(t[i]*hlx)-dx,(y[i]-(ym/2))+(t[i]*hly)-dy,(z[i]-(zm/2))+(t[i]*hlz)-dz); } } } }