Particle[] particles = new Particle[300];
for (int i =0; i<particles.length; i++) {
particles[i] = new Particle(i+2,random(.5,3));
for (int i =0; i<particles.length; i++) {
PVector attractForce = a.defineAttractForce(particles[i],200,1,600);
particles[i].applyForce(attractForce);
float m = particles[i].mass;
PVector gravity = new PVector(0,0.1*m);
PVector n = particles[i].defineConstrainingForceNorth(35);
PVector s = particles[i].defineConstrainingForceSouth(35);
PVector e = particles[i].defineConstrainingForceEast(35);
PVector w = particles[i].defineConstrainingForceWest(35);
PVector friction = particles[i].defineFriction(.001);
particles[i].applyForce(friction);
particles[i].applyForce(n);
particles[i].applyForce(s);
particles[i].applyForce(e);
particles[i].applyForce(w);
particles[i].applyForce(gravity);
particles[i].drawParticles();
location = new PVector(width/2, height/2);
fill(125 + sin(radians(frameCount))*125, 125 + cos(radians(frameCount))*125, 125 + sin(radians(-frameCount))*125);
ellipse(location.x, location.y, mass*2, mass*2);
PVector defineAttractForce(Particle p, float g, float minDistance, float maxDistance) {
PVector forceDir = PVector.sub(location, p.location);
float distance = forceDir.mag();
distance = constrain(distance, minDistance, maxDistance);
float forceMag = (g*mass * p.mass)/(distance*distance);
PVector attractForce = PVector.mult(forceDir, forceMag);
Particle(int topSpeed_, float m) {
location = new PVector(random(width), random(height));
velocity = new PVector(random(-5,5),random(-5,5));
acceleration = new PVector(0,0);
void applyForce(PVector force){
PVector f = PVector.div(force, mass);
PVector defineConstrainingForceNorth(float constantN) {
float consForceMag = constantN/((dist(location.x,0,width,0)*dist(location.x,0,width,0))+1);
PVector consForceDir = velocity.get();
consForceDir.normalize();
PVector forceNorth = PVector.mult(consForceDir,consForceMag);
PVector defineConstrainingForceSouth(float constantS) {
float consForceMag = constantS/((dist(location.x,0,0,0)*dist(location.x,0,0,0))+1);
PVector consForceDir = velocity.get();
consForceDir.normalize();
PVector forceSouth = PVector.mult(consForceDir,consForceMag);
PVector defineConstrainingForceEast(float constantE) {
float consForceMag = constantE/((dist(0,location.y,0,height)*dist(0,location.y,0,height))+1);
PVector consForceDir = velocity.get();
consForceDir.normalize();
PVector forceEast = PVector.mult(consForceDir,consForceMag);
PVector defineConstrainingForceWest(float constantW) {
float consForceMag = constantW/((dist(0,location.y,0,0)*dist(0,location.y,0,0))+1);
PVector consForceDir = velocity.get();
consForceDir.normalize();
PVector forceWest = PVector.mult(consForceDir,consForceMag);
PVector defineFriction( float constantC) {
float consForceMag = constantC;
PVector consForceDir = velocity.get();
consForceDir.normalize();
PVector friction = PVector.mult(consForceDir, consForceMag);
PVector mouse = new PVector(mouseX, mouseY);
PVector dir = PVector.sub(mouse,location);
velocity.add(acceleration);
velocity.limit(topSpeed/70);
fill(125 + sin(radians(frameCount))*125, 125 + cos(radians(frameCount))*125, 125 + sin(radians(-frameCount))*125);
ellipse(location.x, location.y, mass*5, mass*5