toets 1, wind en opwaartse kracht uitgeschakeld

toets 1, wind en opwaarste kracht uitgeschakeld

 

 

foutmelding

 de foutmelding
 
toets 2: wind naar links en geen frictie kracht
 
toets 2: wind naar links en geen frictie kracht
 
 

toets 3, wind naar links en hoge frictie kracht

toets 3, wind naar links en hoge frictie kracht

 

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);
  }
}