import controlP5.*;
int max_particle = 50;
Walker []walkers = new Walker[max_particle];
PVector anchor;
ControlP5 controlP5;
ControlWindow controlWindow;
public float global_acceleration = 0.1;
public float global_attraction = 0.3;
public float global_chaos = 15;
public int global_particles = 5;
public int noiseCounter = 0;
public int velNoiseCounter = 0;
void setup() {
size(800,600);
smooth();
background(0);
controlP5 = new ControlP5(this);
controlP5.setAutoDraw(false);
controlWindow = controlP5.addControlWindow("controlP5window",100,100,250,150);
controlWindow.setBackground(color(40));
Controller attraction_slider = controlP5.addSlider("global_acceleration",0,1,global_acceleration,10,10,100,10);
Controller adjust_slider = controlP5.addSlider("global_attraction",0,1,global_attraction,10,30,100,10);
Controller step_slider = controlP5.addSlider("global_chaos",0,40,global_chaos,10,50,100,10);
Controller particle_slider = controlP5.addSlider("global_particles",1,max_particle,global_particles,10,70,100,10);
attraction_slider.setWindow(controlWindow);
adjust_slider.setWindow(controlWindow);
step_slider.setWindow(controlWindow);
particle_slider.setWindow(controlWindow);
for (int i = 0; i < walkers.length ; i++)
{
walkers[i] = new Walker();
}
anchor = new PVector(width, height);
}
void draw() {
noStroke();
fill(0,50);
rect(0,0,width,height);
for (int i = 0; i < global_particles ; i++)
{
walkers[i].walk();
walkers[i].render();
}
//draw anchor
noStroke();
fill(255,0,0);
ellipse(anchor.x,anchor.y,1,1);
noFill();
stroke(230,0,0);
line(anchor.x - 4,anchor.y,anchor.x + 4,anchor.y);
line(anchor.x,anchor.y - 4,anchor.x,anchor.y + 4);
}
void keyPressed()
{
if (key == 'c' || key == 'C')
{
//cameraMode = !cameraMode;
}
}
void mousePressed()
{
anchor.x = mouseX;
anchor.y = mouseY;
}
void mouseDragged()
{
anchor.x = mouseX;
anchor.y = mouseY;
}
class Walker
{
public PVector location;
public PVector velocity;
Walker()
{
location = new PVector(width/2 + random(0,20) - 10,height/2 + random(0,20) - 10);
velocity = new PVector(0,0);
}
void render()
{
float walkerSize = map(noise(++noiseCounter),0,1,3,8);
// Display circle at x location
stroke(140);
//noStroke();
fill(80);
ellipse(location.x,location.y,walkerSize,walkerSize);
}
// Randomly move up, down, left, right, or stay in one place
void walk()
{
//velocity.x = global_chaos * (noise(++velNoiseCounter) - 0.499);
//velocity.y = global_chaos * (noise(++velNoiseCounter) - 0.499);
velocity.x = global_chaos * (random(0,1) - 0.5);
velocity.y = global_chaos * (random(0,1) - 0.5);
//println(velocity.x + "," + velocity.y);
if (random(0,1) > (1 - global_attraction))
{
PVector gravity = new PVector(anchor.x,anchor.y);
gravity.sub(location);
gravity.mult(global_acceleration * 0.3);
velocity.add(gravity);
}
// Add the current speed to the location.
location.add(velocity);
// Stay on the screen
location.x = constrain(location.x,0,width-1);
location.y = constrain(location.y,0,height-1);
}
}