xxxxxxxxxx
123
let dt = 0.02;
let g = 40;
let N = 20;
let pendulums = [];
class Pendulum {
constructor(oX, oY, t1, t2, v1, v2, m1, m2, c, L) {
this.oX = oX;
this.oY = oY;
this.t1 = t1;
this.t2 = t2;
this.v1 = v1;
this.v2 = v2;
this.a1 = 0;
this.a2 = 0;
this.m1 = m1;
this.m2 = m2;
this.c = c;
this.L = L;
this.path = [];
}
update() {
let denom = this.L*(2*this.m1 + this.m2 - this.m2 * cos(2*(this.t1 - this.t2)));
this.t1 += this.v1 * dt + 0.5 * this.a1 * dt * dt;
this.t2 += this.v2 * dt + 0.5 * this.a2 * dt * dt;
this.v1 += 0.5 * this.a1 * dt;
this.v2 += 0.5 * this.a2 * dt;
this.a1 = -g*(2*this.m1 + this.m2)*sin(this.t1) - this.m2*g*sin(this.t1 - 2*this.t2) - 2*this.m2*sin(this.t1 - this.t2)*(this.v2*this.v2*this.L + this.v1*this.v1*this.L*cos(this.t1 - this.t2));
this.a1 /= denom;
this.a2 = 2*sin(this.t1 - this.t2)*(this.v1*this.v1*this.L*(this.m1 + this.m2) + g*(this.m1 + this.m2)*cos(this.t1) + this.v2*this.v2*this.L*this.m2 * cos(this.t1 - this.t2));
this.a2 /= denom;
this.v1 += 0.5 * this.a1 * dt;
this.v2 += 0.5 * this.a2 * dt;
this.v1 *= 0.999
this.v2 *= 0.999
}
show () {
push()
translate(this.oX, this.oY);
let pos = this.theta_to_x(this.t1, this.t2);
this.path.push(pos);
stroke(0, this.c, 255)
strokeWeight(2)
line(0, 0, pos[0][0], pos[0][1]);
line(pos[0][0], pos[0][1], pos[1][0], pos[1][1]);
strokeWeight(5)
stroke(this.c)
// point(0,0);
// point(pos[0][0], pos[0][1]);
// point(pos[1][0], pos[1][1]);
for(let i = 0; i < this.path.length; ++i) {
let pos = this.path[i];
strokeWeight(map(i, 0, this.path.length, 0.5, 2));
// stroke(this.c + 10)
// point(pos[0][0], pos[0][1]);
stroke(0, this.c, 255)
point(pos[1][0], pos[1][1]);
}
if(this.path.length >= 100) {
this.path.shift();
}
pop();
}
theta_to_x(t1, t2) {
let x1 = sin(t1)*this.L;
let y1 = cos(t1)*this.L;
let x2 = x1 + sin(t2)*this.L;
let y2 = y1 + cos(t2)*this.L;
return [[x1, y1], [x2, y2]];
}
}
function setup() {
createCanvas(windowWidth, windowHeight);
let oX = windowWidth/2;
let oY = windowHeight/2;
let L = min(width, height) / 4 - 20;
for(let i = 0; i < N; ++i) {
let t1 = 0;
let t2 = 0;
let a1 = 0;
let a2 = 0;
let v1 = map(i, 0, 20, 0.9, 1);
let v2 = map(i, 0, 20, -2, -1.9);
let m1 = 1;
let m2 = 1;
let c = map(i, 0, 20,50, 150);
pendulums.push(new Pendulum(oX, oY, t1, t2, v1, v2, m1, m2, c, L));
}
}
function draw() {
background(220,220, 220, 30);
for(let p of pendulums) {
p.update();
p.show();
}
}