/** * Fuzzy philosophers * Program by Raphael Rouvinov-Kats * Created March 2014 * * Click to move the fuzz! * * */ var startingFuzzAmount = 5000; var magnetStrength = 100; var fuzzStrokeWeight = 1; var clickingCreatesFuzz = false; var shakeAmount = 15; var magnetDistance = 40; // draws face in background var drawPhilosopher = function() { noStroke(); // face skin fill(255, 239, 189); beginShape(); vertex(200,320); bezierVertex(200, 330, 280, 270, 300, 200); bezierVertex(300, 200, 315, 150, 310, 100); bezierVertex(310, 100, 315, 15, 200, 10); bezierVertex(200, 10, 140, 10, 100, 50); bezierVertex(100, 50, 50, 115, 100, 215); bezierVertex(120, 250, 88, 233, 178, 320); bezierVertex(178, 320, 198, 325, 200, 320); endShape(); // ear skin beginShape(); // left vertex(80, 140); bezierVertex(40, 110, 65, 250, 97, 209); endShape(); beginShape(); // right vertex(310, 135); bezierVertex(325, 120, 325, 200, 296, 210); endShape(); // eye whites fill(255, 255, 255); ellipse(150, 140, 40, 20); ellipse(250, 140, 40, 20); // eye color fill(12, 0, 179); ellipse(150, 140, 15, 15); ellipse(250, 140, 15, 15); // eyebrows noFill(); stroke(199, 160, 82); strokeWeight(5); bezier(130, 130, 140, 120, 140, 120, 170, 130); bezier(270, 130, 260, 120, 255, 120, 230, 130); // lips bezier(150, 250, 160, 250, 230, 249, 250, 250); // nose bezier(200, 150, 220, 190, 239, 190, 200, 200); }; // create fuzz var fuzz = []; for(var f = 0; f < startingFuzzAmount; f++) { fuzz[f] = [random(0, 400), random(0, 400)]; } var draw = function() { // background and face background(255, 255, 255); drawPhilosopher(); // shake if shake button pressed // add fuzz if clickingCreatesFuzz = true if(mouseIsPressed) { if(mouseX >= 350 && mouseX <= 390 && mouseY >= 10 && mouseY <= 30) { for(var f = 0; f < fuzz.length; f++) { fuzz[f][0] = min(400, max(0, fuzz[f][0] + random(-shakeAmount, shakeAmount))); fuzz[f][1] = min(400, max(0, fuzz[f][1] + random(-shakeAmount, shakeAmount))); } } else if(clickingCreatesFuzz) { fuzz.push([mouseX, mouseY]); } } // fuzz attraction and drawing for(var f = 0; f < fuzz.length; f++) { var d = dist(fuzz[f][0], fuzz[f][1], mouseX, mouseY); var maxD = random(40, 60); var minD = random(1, 5); if(mouseIsPressed && d < maxD && d > minD) { // attract // inversely proportional speed to distance // thank you Ben Burrill for the tip var speed = magnetStrength/d; var xdiff = mouseX - fuzz[f][0]; var ydiff = mouseY - fuzz[f][1]; var angle = atan2(ydiff, xdiff); var dx = speed*cos(angle); var dy = speed*sin(angle); fuzz[f][0] += dx*0.5; fuzz[f][1] += dy*0.5; // if the fuzz overshot, bring it back to the mouse if(dx > 0 && fuzz[f][0] > mouseX || dx < 0 && fuzz[f][0] < mouseX) { fuzz[f][0] = mouseX + random(-2, 2); } if(dy > 0 && fuzz[f][1] > mouseY || dy < 0 && fuzz[f][1] < mouseY) { fuzz[f][1] = mouseY + random(-2, 2); } // jitter fuzz up a little if(random(0, 1) < 0.1) { fuzz[f][0] += random(-5, 5); fuzz[f][1] += random(-5, 5); } // keep fuzz in borders fuzz[f][0] = min(399, max(1, fuzz[f][0])); fuzz[f][1] = min(399, max(1, fuzz[f][1])); } // draw fuzz stroke(0, 0, 0); strokeWeight(fuzzStrokeWeight); point(fuzz[f][0], fuzz[f][1]); } // draw shake button noStroke(); fill(255, 0, 0, 100); if(mouseX >= 350 && mouseX <= 390 && mouseY >= 10 && mouseY <= 30) { fill(255, 0, 0, 150); if(mouseIsPressed) { fill(255, 0, 0, 200); } } rect(350, 10, 40, 20); fill(0, 0, 0); text("shake!", 351, 25); // draw fuzz amount text("fuzz: " + fuzz.length, 10, 380); };