Watch, refresh or doodle... "s" or long touch to hide/show the details Be patient while you still can^^ Try a, b and space keys!
xxxxxxxxxx
/* Pierre MARZIN 07/2014 to Kwang-bum Jang
He is a great Korean artist, 'drawing' fantastic pictures with an orbital sander.
He applies many layers of pavar on a board, let them dry, then removes some of them
with the sander, creating intricate patterns...
http://culturemmag.com/index.php/2014/02/time-does-its-work-artist-jang-kwang-bum/
For this version, I added a few commands:
hit Space bar to reset the number of layers/colors
hit 'b' to get black and white layers
hit 'a' to toggle auto mode
hit 's' to toggle details display
I'm using Craig Reynolds Vehicle model, thanks to Dan Shiffman!
Have fun!
*/
let boids=[];
let nboids=5;
let nblayers,maxlayers=8;
let maxdeep;
let deep=[];
let reds=[], blues=[], green=[];
let mousebrushdia;
let loc;
let auto=true;
let bgcolor;
let drawlayer, moflayer, showmoflayer=true;
function setup() {
createCanvas(windowWidth, windowHeight); //1024, 768);//
pixelDensity(1);
deep=[width*height];
init();
}
function init() {
nblayers=int(random(3,maxlayers));
maxdeep=nblayers*255;
drawlayer=createGraphics(width, height);
moflayer=createGraphics(width, height);
moflayer.background(255, 0);
mousebrushdia=int(random(50, 100));
for (var i=0; i<nboids; i++) {
boids[i]=new Boid(i,random(width), random(height));
}
reds=[nblayers];
greens=[nblayers];
blues=[nblayers];
for (var i=0; i<nblayers; i++) {
reds[i]=random(255);
greens[i]=random(255);
blues[i]=random(255);
}
var bgi=int(random(nblayers));
bgcolor=color(reds[bgi], greens[bgi], blues[bgi]);
drawlayer.background(bgcolor);
reds[nblayers-1]=reds[bgi];
greens[nblayers-1]=greens[bgi];
blues[nblayers-1]=blues[bgi];
for (var i=0; i<4*width*height; i++) {//noprotect
deep[i]=maxdeep;
}
drawlayer.loadPixels();
}
function draw() {
var deeploc, distance, prox, deepval, newcol, r1, r2, g1, g2, b1, b2, amt;
if (mouseIsPressed ) {
for (var i=-mousebrushdia; i<=mousebrushdia; i++) {
for (var j=-mousebrushdia; j<=mousebrushdia; j++) {
deeploc=((j+mouseY+height)%height)*width+i+mouseX;
loc=4*deeploc;
distance=sqrt(i*i+j*j);
prox=25-int(distance*50/mousebrushdia);
if (distance<mousebrushdia/2) {
deep[deeploc]+=maxdeep-prox;
deep[deeploc]%=maxdeep;
deepval=int(deep[deeploc]/255);
r1=reds[(deepval+nblayers-1)%nblayers];
g1=greens[(deepval+nblayers-1)%nblayers];
b1=blues[(deepval+nblayers-1)%nblayers];
r2=reds[deepval];
g2=greens[deepval];
b2=blues[deepval];
amt=(deep[deeploc]%255)/255;
drawlayer.pixels[loc]=r2*amt+(1-amt)*r1;
drawlayer.pixels[loc+1]=g2*amt+(1-amt)*g1;
drawlayer.pixels[loc+2]=b2*amt+(1-amt)*b1;
}
}
}
} else if (auto) {
for (var b=0; b<nboids; b++) {
boids[b].run();
var brushdia=int(boids[b].dia);
for (var i=-brushdia; i<=brushdia; i++) {
for (var j=-brushdia; j<=brushdia; j++) {
deeploc=((j+int(boids[b].location.y)+height)%height)*width+i+int(boids[b].location.x);
loc=4*deeploc;
distance=sqrt(i*i+j*j);
prox=25-int(distance*50/brushdia);
if (distance<brushdia/2) {
deep[deeploc]+=maxdeep-prox;
deep[deeploc]%=maxdeep;
deepval=int(deep[deeploc]/255);
//newcol=lerpColor(colors[(deepval+nblayers-1)%nblayers],colors[deepval], (deep[deeploc]%255)/255); superslow: too many function calls...
r1=reds[(deepval+nblayers-1)%nblayers];
g1=greens[(deepval+nblayers-1)%nblayers];
b1=blues[(deepval+nblayers-1)%nblayers];
r2=reds[deepval];
g2=greens[deepval];
b2=blues[deepval];
amt=(deep[deeploc]%255)/255;
drawlayer.pixels[loc]=r2*amt+(1-amt)*r1;
drawlayer.pixels[loc+1]=g2*amt+(1-amt)*g1;
drawlayer.pixels[loc+2]=b2*amt+(1-amt)*b1;
}
}
}
}
}
drawlayer.updatePixels();
image(drawlayer, 0, 0);
if (showmoflayer) {
moflayer.clear();//background(255, 0);
if (! mouseIsPressed) {
for (var b=0; b<nboids; b++) {
boids[b].display();
}
}
else{
moflayer.fill(255,100);
moflayer.strokeWeight(1);
moflayer.ellipse(mouseX,mouseY,mousebrushdia,mousebrushdia);
}
image(moflayer, 0, 0);
}
}
function touchStarted() {
showmoflayer=!showmoflayer;
}
function keyReleased() {
switch (keyCode) {
case 32:
init();
break;
case 65:
auto=!auto;
break;
case 66:
nblayers=2;
deep=[width*height];
for (var i=0; i<nboids; i++) {
boids[i]=new Boid(i,random(width), random(height));
}
maxdeep=510;
reds=[nblayers];
reds[0]=0;
reds[1]=255;
greens=[nblayers];
greens[0]=0;
greens[1]=255;
blues=[nblayers];
blues[0]=0;
blues[1]=255;
for (var i=0; i<width*height; i++) {
deep[i]=maxdeep;
}
drawlayer.background(255);
drawlayer.loadPixels();
break;
case 83:
showmoflayer=!showmoflayer;
break;
}
}
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
}