1. //charcoal_140919b
    ArrayList<PointPosition> pointPosition = new ArrayList();
    int threshold, pModifier;
    boolean alternate = true;
    int[] directions = {
      (width*-1)-1,
      (width*-1)+1,
      width+1,
      width-1
    };

    void setup() {
      size(500, 750);
      frameRate(24);
      threshold = 135;
      startScatter();
    }

    void draw() {
      fill(255,2);
      rect(-2,-2,width+2,height+2);  
      int i = 0;
      for(PointPosition p:pointPosition){
        i++;
        pModifier = directions[int(random(directions.length))];
        p.tpos.x = p.tpos.x+cos(millis()/pModifier)*width/(i+25);
        p.tpos.y = p.tpos.y+sin(millis())*width/(i+25);
        p.update();
        p.render();
      }
      loadPixels();
        for (int k=width+1; k<width*height-width-1; k++){
          pModifier = directions[int(random(directions.length))];
          if (brightness(pixels[k]) < threshold){
            pixels[k+pModifier] = color(
              int(red(pixels[k+1])),
              int(green(pixels[k+width])),
              int(blue(pixels[k+width])),
              int(brightness(pixels[k+1]))
            );
          } else if (brightness(pixels[k]) == threshold) {
            pixels[k-pModifier] = color(
              int(red(pixels[k+pModifier])),
              int(green(pixels[k-pModifier])),
              int(blue(pixels[k+pModifier])),
              int(brightness(pixels[k-pModifier]))
            );
          } else {
            pixels[k] = color(
              int(red(pixels[k+width])),
              int(green(pixels[k+1])),
              int(blue(pixels[k+1])),
              int(brightness(pixels[k+width]))
            );
          }
        }
      updatePixels();
      threshold = setThreshold(threshold,1,255);
    }

    int setThreshold(int threshold, int minThreshold, int maxThreshold) {
      if (threshold <= maxThreshold && threshold >= minThreshold && alternate) {
        threshold++;
      } else if (threshold <= maxThreshold && threshold >= minThreshold) {
        threshold—;
      } else if (alternate) {
        threshold = maxThreshold;
        alternate = !alternate;
      } else {
        threshold = minThreshold;
        alternate = !alternate;
      }
      return threshold;
    }

    class PointPosition {
      PVector pos = new PVector();
      PVector tpos = new PVector();
      void update(){
        pos.lerp(tpos,0.01);
      }
      void render(){
        point(pos.x,pos.y);
      }
    }

    void startScatter(){
      for (int i=0; i<width; i++) {
        PointPosition p = new PointPosition();
          p.pos.x = width/2;
          p.pos.y = height/2;
          p.tpos.x = width/2+cos(i)*width/3;
          p.tpos.y = height/2+sin(i)*width/3;
        pointPosition.add(p);
      }
    }

     
  2. //charcoal_140919a

     
  3. //collar_140916a

     
  4. //collar_140916c
    ArrayList<PointPosition> pointPosition = new ArrayList();
    int threshold, pModifier;
    boolean alternate = true;
    int[] directions = {
      (width*-1)-1,
      (width*-1)+1,
      width+1,
      width-1
    };

    void setup() {
      size(500, 750);
      frameRate(24);
      threshold = 135;
      startScatter();
    }

    void draw() {
      fill(0,5);
      rect(-2,-2,width+2,height+2);  
      int i = 0;
      for(PointPosition p:pointPosition){
        i++;
        p.tpos.x = p.tpos.x+cos(millis()/TAU)*width/i*TAU;
        p.tpos.y = p.tpos.y+sin(millis())*width/i*12;
        p.update();
        p.render();
      }
     
      loadPixels();
        for (int k=width+1; k<width*height-width-1; k++){
          pModifier = directions[int(random(directions.length))];
          if (brightness(pixels[k]) < threshold){
            pixels[k-width] = color(
              int(red(pixels[k+width])),
              int(green(pixels[k+width])),
              int(blue(pixels[k+width])),
              int(brightness(pixels[k-width]))
            );
          } else if (brightness(pixels[k]) == threshold) {
            pixels[k-pModifier] = color(
              int(red(pixels[k+pModifier])),
              int(green(pixels[k+pModifier])),
              int(blue(pixels[k+pModifier])),
              int(brightness(pixels[k-pModifier]))
            );
          } else {
            pixels[k-1] = color(
              int(red(pixels[k+width])),
              int(green(pixels[k+1])),
              int(blue(pixels[k+1])),
              int(brightness(pixels[k-1]))
            );
          }
        }
      updatePixels();
      threshold = setThreshold(threshold,1,153);
    }

    int setThreshold(int threshold, int minThreshold, int maxThreshold) {
      if (threshold <= maxThreshold && threshold >= minThreshold && alternate) {
        threshold++;
      } else if (threshold <= maxThreshold && threshold >= minThreshold) {
        threshold—;
      } else if (alternate) {
        threshold = maxThreshold;
        alternate = !alternate;
      } else {
        threshold = minThreshold;
        alternate = !alternate;
      }
      return threshold;
    }

    class PointPosition {
      PVector pos = new PVector();
      PVector tpos = new PVector();
      void update(){
        pos.lerp(tpos,0.01);
      }
      void render(){
        stroke(255,5);
        point(pos.x,pos.y);
        line(pos.x,pos.y,tpos.x,tpos.y);
      }
    }

    void startScatter(){
      for (int i=0; i<width*10; i++) {
        PointPosition p = new PointPosition();
          p.pos.x = width/2;
          p.pos.y = height/2;
          p.tpos.x = width/2+cos(i)*width/3;
          p.tpos.y = height/2+sin(i)*width/3;
        pointPosition.add(p);
      }
    }

     
  5. //collar_140916b

     
  6. //charcoal_140915c

     

  7. hearthistorian:

    My friend James (Tumblr: http://blog.jamesmakes.com/ ) was recently featured on Vice’s The Creator’s Project. They described his work as a “constant search for new artistic vistas through creative coding, GIF animation, and pixel sorting, amongst other digital media.”

    James may be a…

    Interesting piece from my friend on digital art in an art historical context. Humbled to be referenced in there!

     
  8. //charcoal_140915b

     
  9. //charcoal_140915a

     
  10. //unordered_140909c