import traer.physics.*;
PFont font;
ParticleSystem physics;
Particle[] p;
Spring[] s;
int maxnum = 26;
int num = 3; // num particles
int spp = 6; // springs per particle
int f = 0;
int bg = 255;
boolean samedistance = true;
void setup() {
size(400, 400);
fill(0);
framerate(24);
textAlign(CENTER);
ellipseMode(CENTER);
physics = new ParticleSystem(0, 0.05);
p = new Particle[maxnum];
font = loadFont("Prototype-20.vlw");
for (int i=0; i<num; i++) addParticle(i);
//p[0].makeFixed();
//p[0].setMass(25);
}
void addParticle(int i) {
int x = int(sin(random(TWO_PI))*(i+1)) + width/2;
int y = int(cos(random(TWO_PI))*(i+1)) + height/2;
p[i] = physics.makeParticle(1.0,x,y,0);
int restLength = samedistance ? width/2 : int(random(width/2));
for (int j=0; j<i; j++) {
physics.makeSpring(p[i], p[j], 1.0, 0.1, restLength);
}
}
void keyPressed() {
switch (key) {
case 's': samedistance=!samedistance; break;
case 'r': resetParticles(); break;
case 'c': physics.clear(); num=0; break;
case ' ':
case '+': if (num<maxnum) addParticle(num++); break;
case '-': if (num>0) p[--num].kill(); break;
case CODED: {
switch (keyCode) {
case RIGHT: if (num<maxnum) addParticle(num++); break;
case LEFT: if (num>0) p[--num].kill(); break;
}
}
}
}
void resetParticles() {
for (int i=0; i<num; i++) {
int x = int(sin(random(TWO_PI))*(i+0)) + width/2;
int y = int(cos(random(TWO_PI))*(i+0)) + height/2;
p[i].moveTo(x,y,p[i].position().z());
}
}
void draw() {
background(f);
fill(bg);
ellipse(width/2,height/2,width,height);
physics.advanceTime(.1);
for (int i=0; i<num; i++) {
for (int j=i; j<min(i+spp,num); j++) {
if (i!=j) {
stroke(f,25);
line(p[i].position().x(), p[i].position().y(), p[j].position().x(), p[j].position().y());
}
}
}
for (int i=0; i<num; i++) {
fill(f);
textFont(font, 20);
text(char(i+65), p[i].position().x(), p[i].position().y());
}
String info = "";
if (samedistance) info+="s";
fill(bg);
textFont(font, 20);
//text(info,8,height-5);
}