final int NB_PARTICLES = 200;
ArrayList<Triangle> triangles;
Particle[] parts = new Particle[NB_PARTICLES];
MyColor myColor = new MyColor();
for (int i = 0; i < NB_PARTICLES; i++)
parts[i] = new Particle();
triangles = new ArrayList<Triangle>();
for (int i = 0; i < NB_PARTICLES; i++)
for (int i = 0; i < NB_PARTICLES; i++)
p1.neighboors = new ArrayList<Particle>();
for (int j = i+1; j < NB_PARTICLES; j++)
float d = PVector.dist(p1.pos, p2.pos);
if (d > 0 && d < Particle.DIST_MAX)
if(p1.neighboors.size() > 1)
addTriangles(p1.neighboors);
fill(myColor.R, myColor.G, myColor.B, 13);
stroke(max(myColor.R-15, 0), max(myColor.G-15, 0), max(myColor.B-15, 0), 13);
for (int i = 0; i < triangles.size(); i ++)
Triangle t = triangles.get(i);
void addTriangles(ArrayList<Particle> p_neighboors)
int s = p_neighboors.size();
for (int i = 1; i < s-1; i ++)
for (int j = i+1; j < s; j ++)
triangles.add(new Triangle(p_neighboors.get(0).pos, p_neighboors.get(i).pos, p_neighboors.get(j).pos));
float R, G, B, Rspeed, Gspeed, Bspeed;
final static float minSpeed = .7;
final static float maxSpeed = 1.5;
Rspeed = (random(1) > .5 ? 1 : -1) * random(minSpeed, maxSpeed);
Gspeed = (random(1) > .5 ? 1 : -1) * random(minSpeed, maxSpeed);
Bspeed = (random(1) > .5 ? 1 : -1) * random(minSpeed, maxSpeed);
Rspeed = ((R += Rspeed) > 255 || (R < 0)) ? -Rspeed : Rspeed;
Gspeed = ((G += Gspeed) > 255 || (G < 0)) ? -Gspeed : Gspeed;
Bspeed = ((B += Bspeed) > 255 || (B < 0)) ? -Bspeed : Bspeed;
final static float RAD = 4;
final static float BOUNCE = -1;
final static float SPEED_MAX = 2.2;
final static float DIST_MAX = 50;
PVector speed = new PVector(random(-SPEED_MAX, SPEED_MAX), random(-SPEED_MAX, SPEED_MAX));
PVector acc = new PVector(0, 0);
ArrayList<Particle> neighboors;
pos = new PVector (random(width), random(height));
ellipse(pos.x, pos.y, RAD, RAD);
Triangle(PVector p1, PVector p2, PVector p3)