> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.ACIF3J0NyrW/rev.77
 * 
 * authors: 
 *   GoToLoop

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



/**
 * Project Drone Wing (v2.51)
 * by  Strinda (2014/Aug)
 * mod Chrisir & GoToLoop
 *
 * forum.processing.org/two/discussion/6368/project-drone-wing
 *
 * studio.processingtogether.com/sp/pad/export/ro.9D4K1FIWJ7Kxc/latest
 * studio.processingtogether.com/sp/pad/export/ro.9KGl7nv$8EvrZ/latest
 */

static final int NUM = 10, FPS = 60, BG = -1;
final Droid[] snipes = new Droid[NUM];
final PVector target = new PVector();

void setup() {
  size(600, 600, JAVA2D);
  smooth(4);
  frameRate(FPS);

  fill(Droid.FILL);
  stroke(Droid.STROKE);
  strokeWeight(Droid.WEIGHT);

  for ( int i = 0; i != NUM; snipes[i++] = new Droid() );
}

void draw() {
  background(BG);
  target.set(mouseX, mouseY);
  for (Droid d: snipes)  d.script(target);
}

final class Droid {
  static final color FILL = 0250, STROKE = 0;
  static final short RAD = 4, DIAM = RAD<<1;
  static final float MAX_SPD = 6.0, MAX_FORCE = .1, WEIGHT = 1.5;

  final PVector
    loc = new PVector(random(width), random(height))
    , vel = new PVector(random(-2, 2), random(-2, 2))
      , acc = new PVector();

  void script(PVector target) {
    seek(target);
    update();
    display();
  }

  void seek(PVector target) {
    if (1/2 != 1/2.) {
      PVector.sub(target, loc, acc).setMag(MAX_SPD);
      PVector.sub(acc, vel, acc).limit(MAX_FORCE);
    }

    else {
      acc.set(target);
      acc.sub(loc);
      acc.normalize();
      acc.mult(MAX_SPD);

      acc.sub(vel);
      acc.limit(MAX_FORCE);
    }
  }

  void update() {
    vel.add(acc);
    vel.limit(MAX_SPD);
    loc.add(vel);
  }

  void display() {
    translate(loc.x, loc.y);
    rotate(vel.heading2D() + HALF_PI);
    triangle(0, -DIAM, -RAD, DIAM, RAD, DIAM);
    resetMatrix();
  }
}