start situatie array van 10 ballen, wind = 0.25
zwaartekracht = 0,1,
opwaartse kracht = 0.1
met random massa's en kleur toetsfuncties 1) x positie attractor = x -10*n 2) x positie attractor = x 3) x positie attractor = x + 10 *n 4) constrain: cl = 1, ch = 1 5) constrain: cl = n en ch = 100*n 6) wind naar rechts ingeschakeld 7) gewicht toegevoegd 8) opwaarste kracht toegevoegd 9) diverse spannende veranderingen 0) resetknop |
nog meer toetsfuncties: z) achtergrond = zwart, c) achtergrond weer wit, s) bewegingen stoppen, d) afbeelding downloaden
6aantrekkingskracht van attractor op ballen . terug naar de inleiding ga naar de animatie in fullScreen
Zie voor de theorie de Youtube tutorial gravitational attraction
Voor dit effect is in de Attractor class in regel 17 de constrain functie toegevoegd
In setup wordt een array van 10 movers aangemaakt
De constructor argumenten van de mover objecten:
7) diameter van de ballen 8) kleur van de ballen
De constructor argumenten van het attractor object:
1) en 2) positie van de attractor, 3) massa, 4) en 5) constrain variabelen cl en ch, 6) attractor kracht constante
let movers = []; let attractor; let n; zwart = false;
function setup() {
createCanvas(windowWidth, windowHeight);
x = width/2;
y = height/2;
n = height/20;
for (let i = 0; i < 10; i++) {
// constructor 1 2 3 4 5
movers[i] = new Mover5(random(width),random(height), 0.25, 0.1, 10,
//6 7 8
0.1, n/2*random(1,3), color(random(0,150),random(100,150), random(100,150),50));
}
//constructor 1 2 3 4 5 6
attractor = new Attractor(x, y, n, 100*n, 1 , 10);
if (zwart) {
background(0);
}
else{
background('#E6FBFF');
}
}
function draw() {
for (let mover of movers) {
if (key == 's' || key == 'S') {
}
else {
//update moet altijd als eerste worden uitgevoerd!
mover.update();
if (key == 6) { mover.wind();}
if (key == 7) { mover.gewicht();}
if (key == 8) { mover.drag();}
mover.show();
mover.edges();
attractor.attract(mover);
}
}
}
function keyPressed() {
if (key == '1') {
attractor.pos.x = x-10*n
attractor.show();
}
if (key == '2') {
attractor.pos.x = x
attractor.show();
}
if (key == '3') {
attractor.pos.x = x+10*n
attractor.show();
}
if (key == '4') {
attractor.cl = 1;
attractor.ch = 1;
}
if (key == '5') {
attractor.cl = n;
attractor.ch = 100*n;
}
if (key == '9') {
for (let i = 0; i < 10; i++) {
movers[i].x = random(width);
movers[i].y = random(height);
movers[i].d = n/2*random(1,3);
movers[i].c = color(random(100,250),random(100,150), random(0,150),50)
movers[i].accSet();
}
}
if (key == '0') {
setup();
}
if (key == 'd' || key == 'D'){
save('aantrekingskracht.png');
}
if (key == 'z') {
zwart = true;
setup();
}
if (key == 'c') {
zwart = false;
setup();
}
}
class "Attractor"
De attract methode (regel 15) is een uitwerking van de Newton's law of universal gravitation
-
tbv de animatie staat distanceSq (is r2) in een constrain, zo krijgt distanceSq een min en max waarde
class Attractor {
//constructor 1 2 3 4 5 6
constructor(x, y, m, cl, ch, g) {
this.mass = m; this.cl = cl; this.ch = ch; this.G = g;
this.pos = createVector(x,y);
this.r = sqrt(this.mass)*3;
}
show() {
fill(255,0,0);
ellipse(this.pos.x, this.pos.y, this.r*2);
}
//mover object als argument van de attract methode
//Dit is het object waar andere mover objecten door worden aangetrokken
attract(mover) {
let force = p5.Vector.sub(this.pos, mover.pos);
let distanceSq = constrain(force.magSq(), this.cl , this.ch);
let strength = this.G * (this.mass * mover.mass) / distanceSq;
//strength is de kracht die de atractor op de mover uitoefend
//Door het bewegen van de mover wordt de afstand steeds kleiner en strength groter
//zo zal de mover zich versnellen
//zodra de afstand tussen het bewegende object en het attractor object 0 is
//zal de kracht heel hoog worden en het object zal de attractor voorbij schieten
force.setMag(strength);
mover.krachten(force);
}
}