xxxxxxxxxx
99
//Control with arrow keys!!!
let movers = [];
let attractor;
function setup() {
createCanvas(600, 600);
for (let i = 0; i < 30; i++) {
let x = random(width);
let y = random(height);
let m = random(50, 150);
movers[i] = new Mover(x, y, m);
}
attractor = new Attractor(width / 2, height / 2, 100);
background(0);
}
function draw() {
background(0);
for (let mover of movers) {
mover.update();
mover.show();
attractor.attract(mover);
}
attractor.show();
attractor.update();
attractor.control();
}
class Attractor {
constructor(x, y, m) {
this.pos = createVector(x, y);
this.mass = m;
this.r = sqrt(this.mass) * 2;
this.vel = p5.Vector.random2D(0,0);
}
attract(mover) {
let force = p5.Vector.sub(this.pos, mover.pos);
let distanceSq = constrain(force.magSq(), 400, 800);
let G = 3;
let strength = (G * (this.mass * mover.mass)) / distanceSq;
force.setMag(strength);
mover.applyForce(force);
}
update(){
this.pos.add(this.vel);
}
control(){
if (keyIsDown(38)){
this.vel.add(0.06, -0.06);
} else if (keyIsDown(40)){
this.vel.add(-0.06, 0.06);
}
if (keyIsDown(37)){
this.vel.add(-0.06);
} else if (keyIsDown(39)){
this.vel.add(0.06);
}
}
show() {
noStroke();
fill(255);
ellipse(this.pos.x, this.pos.y, this.r * 1);
}
}
class Mover {
constructor(x, y, m) {
this.pos = createVector(x, y);
this.vel = p5.Vector.random2D();
this.vel.mult(3);
this.acc = createVector(0, 0);
this.mass = m;
this.r = sqrt(this.mass) * 2;
}
applyForce(force) {
let f = p5.Vector.div(force, this.mass);
this.acc.add(f);
}
update() {
this.vel.add(this.acc);
this.pos.add(this.vel);
this.acc.set(0, 0);
}
show() {
noStroke();
fill(255, 120, 50);
ellipse(this.pos.x, this.pos.y, this.r * 0.5);
}
}