start situatie

array van 20 ballen, random wind,
random wrijving
dezelfde zwaartekracht

 

toetsfuncties

1) wrijving en wind "0"

2) wind naar links  

3) wind naar rechts,

    ballen met andere random gewichten

4) ballen krijgen random x, y vectoren

    versnellingsvector reset op "0"

5) resetknop
 
 

 

wind, zwaartekracht en wrijving uitgeoefend op ballen met verschillende massa     terug naar de inleiding

De schets maakt gebruik van objecten van de class "Mover4" (staat onder deze schets) en de class "Ruitjes"

Door de kracht van wind worden ballen met een laag gewicht sneller weggeblazen.
Door de wrijving of friction bewegen sommige ballen langzamer
In de class wordt de frictie formule -1 * mu * N * genormaliseerde snelheid (regel 27 t/m 38) toegepast
Alle berekende krachten worden bij de acc (versnellingvector) opgeteld
 
 

 
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) snelheid xv in x richting, 6) snelheid yv in y richting,7) wrijving 8) diameter bal, 9) kleur bal
 
  for (let i = 0; i < 20; i++) {
  //constructor                   1     2       3           4     5
  movers[i] = new Mover4(random(width), 0, 0.1*random(1,2), 0.01, 0,
//  6       7             8                     9
  0.01, random(1,3), n*random(1,3), color(150,random(0,150), random(0,150),100));
  }
 
  ruitjespap = new Ruitjes(n, x, y);
}
 
function draw() {
  background('#E6FBFF');
  ruitjespap.display();
 
  for (let mover of movers) {
    mover.applyForce();
    mover.update();
    mover.edges();
    mover.show();
  }
}
 
function keyPressed() {
 if (key == '1') {
   for (let i = 0; i < 20; i++) {
     movers[i].xk = 0;
     movers[i].mu = 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(2,6);
  }
}
 
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();
}
}

class "Mover4"

 
class Mover4 {
  constructor(x, y, xk, yk, xv, yv, mu, d, c) {
    this.xk = xk; this.yk = yk;
    this.mu = mu; this.c = c; this.d = d;
    //de massa is afgeleid van de diameter van de ellipsen
    this.mass = sqrt(d/2)*PI;
    this.vel = createVector(xv,yv);//snelheidsvector
    this.pos = createVector(x,y);  //positie vector,
    this.acc = createVector(0,0);  //versnellingsvector
}
 
  applyForce() {
    let wind = createVector(this.xk,0);
    this.krachten(wind);
 
    //door massa is er minder zwaartekracht versnelling 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);
 
    //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);
    }
}
 
 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);
}
//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);
  }
}