mouse impact
@author
float historySize = 5;
ArrayList<PVector> mouseVelocities;
ArrayList<Particle> particles;
void setup(){
size(640, 640);
noStroke();
fill(255);
mouseVelocities = new ArrayList<PVector>();
particles = new ArrayList<Particle>();
}
void draw(){
background(0);
ArrayList<Particle> nextParticles = new ArrayList<Particle>();
for(Particle p: particles){
p.display();
p.update();
if(!p.isBlowedOut()){
nextParticles.add(p);
}
}
particles = nextParticles;
mouseVelocities.add(new PVector(mouseX - pmouseX, mouseY - pmouseY));
if(mouseVelocities.size() > historySize){
mouseVelocities.remove(0);
}
if(mouseVelocities.size() == historySize){
PVector acc = new PVector(0, 0);
for(int i = 0; i < mouseVelocities.size() - 1; i++){
acc.add(PVector.sub(mouseVelocities.get(i + 1), mouseVelocities.get(i)));
}
acc.div(mouseVelocities.size() - 1);
float pNum = acc.mag() * 4.0;
for(int i = 0; i < pNum; i++){
PVector vel = PVector.mult(acc, -1);
vel.limit(5.0);
float randVelSize = random(0, vel.mag());
float randVelAng = random(TWO_PI);
PVector randVel = new PVector(randVelSize * cos(randVelAng), randVelSize * sin(randVelAng));
vel.add(randVel);
particles.add(new Particle(vel));
}
}
}
class Particle {
PVector loc, vel;
float size;
Particle(PVector _vel){
loc = new PVector(mouseX, mouseY);
vel = _vel;
size = random(1, 3);
}
void display(){
ellipse(loc.x, loc.y, size, size);
}
void update(){
loc.add(vel);
vel.mult(0.95);
size *= 0.95;
}
boolean isBlowedOut(){
return size < 0.1;
}
}