toetsfuncties
1) rode bal  kracht xk,  is een wind naar rechts
2) rode bal xk kracht = 0, wind is gestopt
3) groene bal hogere snelheid in -x richting
4) lichtblauwe bal hogere snelheid  in y richting
5) resetknop
 

 

krachten op bal in x en y richting   terug naar de inleiding

De schets maakt gebruik van de class "Mover2", staat onder deze schets, en de class "Ruitjes"

De schets is een simulatie van de wet van Newton: kracht = massa x snelheid
In dit voorbeeld geldt massa = 1 dus kracht = snelheid in dit voorbeeld zijn dit yk = verticale snelheid en xk = horizontale snelheid
  
 

let mover1; let mover2; let mover3; let mover4;
 
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) snelheid xv in x richting, 6) snelheid yv in y richting, 7) diameter bal , 8) kleur bal 
 //constructor       1  2  3   4     5  6   7     8 
 mover1 = new Mover2(x, y, 0, 0.001, 0, 0,  n, color(255,0,0));//rode bal 
 //mover 2 kracht in -x richting de bal stuitert naar links 
 mover2 = new Mover2(x, y, -0.001, 0, 0, 0, 2*n,color(0,255,0));//groene bal 
 //mover 3 kracht in -y richting dus de bal stuitert omhoog 
 mover3 = new Mover2(x, y, 0, -0.001, 0, 0, 2*n,color(0,255,255));//lichtblauwe bal 
 //mover 4 kracht in x richting de bal stuitert naar rechts 
 mover4 = new Mover2(x, y, 0.001, 0, 0, 0, 2*n,color(0,0,255));//blauwe bal 
 ruitjespap = new Ruitjes(n, x, y); 
} 

 
function draw() { 
 background('#E6FBFF'); 
 ruitjespap.display(); 
 mover1.edges(); 
 mover1.update(); 
 mover1.show(); 
 mover1.applyForce(); 

 
mover2.edges(); 
 mover2.update(); 
 mover2.show(); 
 mover2.applyForce(); 

 
mover3.edges(); 
 mover3.update(); 
 mover3.show(); 
 mover3.applyForce(); 

 
mover4.edges(); 
 mover4.update(); 
 mover4.show(); 
 mover4.applyForce(); 
} 

function keyPressed() { 
 if (key == '1') { 
 mover1.accSet();  //rode bal 
 mover1.xk = 0.005; 
} 
 if (key == '2') { 
 mover1.accSet(); //rode bal 
 mover1.xk = 0; 
} 
 if (key == '3') { 
 mover2.accSet();  //groene bal 
 mover2.xv = -0.1; 
} 
 if (key == '4') { 
 mover3.accSet();  //lichtblauwe bal 
 mover3.yv = 0.1; 
} 
 if (key == '5') { 
 setup(); 
} 
}
 

de class "Mover2"

yk kan je zwaartekracht noemen en is een kracht in in y richting
xk kan je wind noemen en is een kracht in x richting
als de bal de onderrand van het canvas raakt zal door edges (regel 31) de snelheidvector omdraaien de bal zal in omgekeerde richting bewegen.
gravity zal een vertraging veroorzaken als de snelheidsvariabele yv 0 wordt zal de bal weer naar beneden gaan
met als resultaat een langzaam uitdovend stuiter effect van de bal
Daniel Shiffmann noemt dit de Euler integratie

In de class Mover2 worden de snelheden yk en xk opgeteld bij de versnellingsvector "acc" (regel 18)
In regel 26 de "acc" vector op tellen bij de snelheidsvector "vel" (is een vector die steeds langer wordt) 
In regel 28 de "vel" vector optellen bij de "pos" vector zo zal de bal zich versneld bewegen
 
 
 
class Mover2 {
 
  constructor(x, y, xk, yk, xv, yv, d, c) {
    this.c = c; this.d = d;  this.xk = xk; this.yk = yk;
    this.pos = createVector(x,y); // positie vector,
    this.vel = createVector(xv,yv); //snelheidsvector
    this.acc = createVector(0,0);   //versnellingsvector
}
 
  applyForce() {
  // de krachtvector wordt aangemaakt
  // this.kracht = createVector(this.xk,this.yk);
  // de krachtvector wordt opgeteld bij de versnellingsvector acc
  // this.acc.add(this.kracht);
  // dit mag ook: krachten xk en yk worden opgeteld bij de versnellingsvector
  // je hoef dan geen krachtvector aan te maken
    this.acc.add(this.xk,this.yk);
  }
//voor nieuwe instellingen met de toetsen moet de versnellingsvector 0,0 zijn
  accSet() {
    this.acc.set(0,0);
  }
 
  update(){
    this.vel.add(this.acc);
// door de snelheidsvector bij de positie vector op te tellen wordt de positie van de bal berekend
    this.pos.add(this.vel);
  }
 
  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);
  }
}