start situatie array van 20 ballen, zwaartekracht,
wind, friction en drag = 0,1
met random massa's toetsfuncties 1) wind en drag = "0" 2) wind naar links en friction = "0" 3) wind naar rechts,
ballen met andere random gewichten
sterke friction 4) ballen krijgen random x, y vectoren
versnellingsvector reset op "0" 5) resetknop 6) sterkere drag in blauwe deel s) bewegingen stoppen d) opslaan afbeelding |
|
Als de ballen de grond raken bewegen zij tgv de wind naar rechts, de kleine lichtere ballen wat sneller |
opwaartse kracht toegevoegd uitgeoefend op ballen met verschillende massa. terug naar de inleiding
Opwaartse kracht kan worden veroorzaakt door bijv lucht of water. zie wikipedia "de tweede wet van Newton" zie ook de tutorial van Daniel Shiffman
In de schets is in de onderste helft, het donkerblauwe deel (water), de opwaartse kracht, door op toets 6 te drukken, hoger
De schets maakt gebruik van objecten van de class "Mover5" (staat onder deze schets).
foutmelding
met drag ingeschakeld (regel 34) gaf de foutmelding:
p5.Vector.prototype.mult: x, y, or z arguments are either undefined or not a finite number
de foutmelding ontstaat als een mult bewerking op een (0,0) vector wordt uitgeoefend
ook verloopt het drag effect wat schokkerig
fout opgeheven door in de class Mover5 aan update this.acc.set(0,0); (regel 75) toe te voegen
de foutmelding komt ook in andere situaties voor
let movers = [];
function setup() {
createCanvas(windowWidth, windowHeight);
x = width/2;
y = height/2;
n = height/20;
//constructor
//1) en 2) x,y start positie bal, 3) xk = kracht in x richting 4) yk = kracht in y richting
//5) (lucht) weerstand constante 6) wrijving constante 8) diameter bal, 8) kleur bal
for (let i = 0; i < 20; i++) {
//constructor 1 2 3 4 5
movers[i] = new Mover5(random(width), 0, 0.1, 0.1, 0.1,
// 6 7 8
0.1, n*random(1,3), color(150,random(0,150), random(0,150),100));
}
}
function draw() {
background('#E6FBFF');
noStroke();
fill(0,255,255,50);
rect(0, height/2, width,height/2);
for (let mover of movers) {
if (key == 's' || key == 'S') {
}
else {
mover.wind();
mover.gewicht();
mover.friction();
mover.drag();
if (mover.pos.y > height/2 && key == 6) {
mover.dc = 0.8;
}
mover.update();
mover.edges();
}
mover.show();
}
}
function keyPressed() {
if (key == '1') {
for (let i = 0; i < 20; i++) {
movers[i].xk = 0;
movers[i].dc = 0;
}
}
if (key == '2') {
for (let i = 0; i < 20; i++) {
movers[i].xk = -0.5;
movers[i].mu = 0;
}
}
if (key == '3') {
for (let i = 0; i < 20; i++) {
movers[i].xk = 0.6;
movers[i].d = n*random(1,4);
movers[i].mu = 2.8;
}
}
if (key == '4') {
for (let i = 0; i < 20; i++) {
movers[i].x = random(width);
movers[i].y = random(height);
movers[i].d = n*random(1,3);
movers[i].accSet();
}
}
if (key == '5') {
setup();
}
if (key == 'd' || key == 'D'){
save('krachtenspel.png');
}
}
class "Mover5"
met de 4 methodes "wind", "gewicht" , "friction" , en "drag"
friction is wrijving en drag is opwaartse kracht
class Mover5 {
// 1 2 3 4 5 6 7 8
constructor(x, y, xk, yk, mu, dc, d, c) {
this.xk = xk; this.yk = yk; this.dc = dc;
this.mu = mu; this.c = c; this.d = d;
//de massa is afgeleid van de diameter van de ellipsen
this.mass = sqrt(d/2);
this.vel = createVector(0,0);//snelheidsvector
// this.vel = p5.Vector.random2D();
this.pos = createVector(x,y); //positie vector,
this.acc = createVector(0,0); //versnellingsvector
}
wind() {
let wind = createVector(this.xk,0);
this.krachten(wind);
}
gewicht() {
//het gewicht van een massa wordt bepaald door de aantrekingskracht van de aarde
//eerst de zwaartekracht versnelling bepalen zv want versnelling = kracht/massa
let gravity = createVector(0,this.yk);
let zv = p5.Vector.div(gravity, this.mass);
//het gewicht van de massa wordt bepaald door de zwaartekracht versnelling zv
//te vermenigvuldigen met de massa
//zo vallen kleine massa's net zo snel als de grote massa's
let gewicht = p5.Vector.mult(zv,this.mass);1
this.acc.add(gewicht);
}
friction() {
//code voor friction vector toevoegen die alleen optreed als de bal de onderrand raakt
let diff = height - (this.pos.y + this.d/2);
if (diff < 1) {
// de friction formule: friction = -1 * mu * N * genormaliseerde snelheidsvector)
// N = friction tgv het gewicht
// mu = friction coefficient
// -1 omdat de frictie tegengesteld is aan de vel
// bij object met een verticale versnelling werkt de code niet goed
let friction = this.vel.copy();
friction.normalize();//zo is de lengte van de vector 1
friction.mult(-1);// friction vector is tegengesteld aan de snelheidsvector
let normal = this.mass;
friction.setMag(this.mu * normal); //magnitude is de lengte van de friction vector Fv
this.krachten(friction);
}
}
drag() {
// De formule: Fd = -1/2 * rho * vel.mag*vel.mag * A * Cd * vel Hierin zijn rho, A en Cd constanten
// de vereenvoudigde formule: Fd = -1 * dc * vel.mag*vel.mag * vel
// Dus de drag force Fd is mede afhankelijk van de snelheid van de massa
// code voor de drag vector de code is vrijwel indentiek aan de code voor friction
// nu zonder if statement en wordt de lengte van de drag vector mede bepaald
// door de lengte van de snelheidsvector "vel" in het kwadraat
//te zien is dat de objecten met minder massa zich minder versnellen
let drag = this.vel.copy();
drag.normalize();
drag.mult(-1);
let speedSq = this.vel.magSq();
drag.setMag(this.dc * speedSq);
this.krachten(drag);
}
krachten(force) {
//versnelling = kracht/massa
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);
}
//voor nieuwe instellingen met de toetsen moet de versnellingsvector 0,0 zijn
accSet() {
this.acc.set(0,0);
this.vel.set(0,0);
}
edges() {
if (this.pos.y >= height-this.d/2) {
this.pos.y = height-this.d/2;
this.vel.y = this.vel.y * -1;
}
if (this.pos.y <= 0+this.d/2) {
this.pos.y = 0+this.d/2;
this.vel.y = this.vel.y * -1;
}
if (this.pos.x >= width-this.d/2) {
this.pos.x = width-this.d/2;
this.vel.x = this.vel.x * -1;
}
if (this.pos.x <= 0+this.d/2) {
this.pos.x = 0+this.d/2;
this.vel.x = this.vel.x * -1;
}
}
show(){
stroke(255,0,0);
strokeWeight(2);
fill(this.c);
ellipse(this.pos.x, this.pos.y, this.d, this.d);
}
}