/* Robot Etching Acid number 7 pushing */ pushing [] p; int w,h,count; BImage swap,redraw; int drawit = 1; int rando = 1; void setup(){ count = 0; swap = loadImage("a.gif"); redraw = swap.copy(); w = swap.width; h = swap.height; size(700,549);//applet //size(w,h);//print mode println("Canvas size: width:"+w+" height:"+h); p = new pushing[1000]; for (int i = 0; i < p.length; i++){ p[i] = new pushing(int(random(w)),int(random(h)),int(random(4))); //p[i] = new pushing(i,h-1,3);//debug //p[i] = new pushing(w-1,i,2);//debug } } void loop(){ background(swap); if (keyPressed){ switch(key){ case 's': drawit++; drawit %= 2; break; case 'r': rando++; rando %= 2; break; case 'd': swap = redraw.copy(); break; } } for (int i = 0; i < p.length; i++){ p[i].shunt(); p[i].move(); if(rando == 0){ p[i].d = int(random(4)); } if(drawit == 0){ p[i].draw(); } } } void mousePressed(){ save("pushers.tif"); println("save count "+count++); } class pushing{ int x,y,d; pushing(int x, int y, int d){ this.x = x; this.y = y; this.d = d; } void draw(){ color c = swap.pixels[x + y * w]; noFill(); stroke(c); rect(x-3,y-3,6,6); line(x-2,y,x+2,y); line(x,y-2,x,y+2); } void move(){ switch(d){ case 0: x = (x+1)%w; break; case 1: y = (y+1)%h; break; case 2: x = wr(x-1,w-1); break; case 3: y = wr(y-1,h-1); break; } } void shunt(){ color last = swap.pixels[x + y * w]; color next = swap.pixels[x + y * w]; switch(d){ case 0: for (int i = 1; i < w + 1; i++){ next = swap.pixels[((x + i)%w) + y * w]; swap.pixels[((x + i)%w) + y * w] = last; last = next; } break; case 1: for (int i = 1; i < h + 1; i++){ next = swap.pixels[x + ((y + i)%h) * w]; swap.pixels[x + ((y + i)%h) * w] = last; last = next; } break; case 2: for (int i = 1; i < w + 1; i++){ next = swap.pixels[wr((x - i),w-1) + y * w]; swap.pixels[wr((x - i),w-1) + y * w] = last; last = next; } break; case 3: for (int i = 1; i < h + 1; i++){ next = swap.pixels[x + wr((y - i),h-1) * w]; swap.pixels[x + wr((y - i),h-1) * w] = last; last = next; } break; } } } //screen wrap around function int wr(int v, int lim){ if (v < 0){ v = lim; } return v; }