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