> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://processing-101.sketchpad.cc/sp/pad/view/ro.QMdOn23oNKa/rev.6
 * 
 * authors: 
 *   Ben Chun

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 




int timer;
int lastX;
int lastY;
int lastDripX;
int lastDripY;

void setup()
{
  size(400,400);
  //frameRate(60);
  timer = 0;
  lastX = lastDripX = mouseX;
  lastY = lastDripY = mouseY;
  fill(0);
  background(255);
  smooth();
  strokeJoin(ROUND);
}

void draw()
{
  fill(0);
  float d = dist(lastDripX, lastDripY, mouseX, mouseY);
  if (d > 200)
  {
    int numDrips = (int)random(3);
    randomCircles(mouseX, mouseY, numDrips, 2, 10, 10, 30);
    lastDripX = mouseX;
    lastDripY = mouseY;
  }
  int dx = abs(mouseX - lastX);
  int dy = abs(mouseY - lastY);
  if ((dx == 0) && (dy == 0))
  {
    strokeWeight(1);
  }
  else if (dist(mouseX,mouseY, lastX,lastY) < 2 )
  {
    strokeWeight(10);
  }
  else
  {
     strokeWeight(150/(dx+dy+15));
     timer = 0;
  }
  line(mouseX,mouseY, lastX,lastY);
  lastX = mouseX;
  lastY = mouseY;
  
  if (timer > 15)
  {
    clouds(15, 30, 10, 20);
    timer = (int)random(-50,15);
  }
  timer++;
}

void randomCircles(int x, int y, int numCircles, int minSize, int maxSize, int minDist, int maxDist)
{
  for(int i=0; i<numCircles; i++)
  {
    float r = minSize + random(maxSize-minSize);
    float offsetX = minDist + random(maxDist - minDist);
    float offsetY = minDist + random(maxDist - minDist);
    float flipX = random(1);
    if (flipX > 0.5) offsetX *= -1;
    float flipY = random(1);
    if (flipY > 0.5) offsetY *= -1;
    ellipse(x+offsetX, y+offsetY, r, r);
  }
}

void clouds(int minmin, int minmax, int maxmin, int maxmax)
{
  
  float minsize = random(minmin,minmax);
  float maxsize = minsize + random(maxmin,maxmax);
  
  for(int i=0; i<6; i++)
  {
    pushMatrix();
    translate(mouseX, mouseY);
    rotate(radians(random(360))); 
    beginShape();
    vertex(0, 0);
    bezierVertex(0, 0+random(minsize,maxsize), 0+random(minsize,maxsize), 0, 0, 0);
    bezierVertex(0, 0-random(minsize,maxsize), 0-random(minsize,maxsize), 0, 0, 0);
    bezierVertex(0+random(minsize,maxsize), 0, 0, 0-random(minsize,maxsize), 0, 0);
    bezierVertex(0-random(minsize,maxsize), 0, 0, 0+random(minsize,maxsize), 0, 0);
    endShape();
    popMatrix();
  }
  
}