xxxxxxxxxx
79
const numPendulums = 2; // Number of pendulums
const pendulums = [];
function setup() {
createCanvas(800, 600);
// Create the pendulums
for (let i = 0; i < numPendulums; i++) {
const pendulum = createPendulum(width / 2, 200, 100, random(0.2, 0.5), random(0.2, 0.5));
pendulums.push(pendulum);
}
}
function draw() {
background(255);
// Update and draw the pendulums
for (let i = 0; i < numPendulums; i++) {
const pendulum = pendulums[i];
pendulum.update();
pendulum.draw();
}
}
function createPendulum(x, y, length1, angle1, angle2) {
const p = {
x: x,
y: y,
length1: length1,
length2: length1,
angle1: angle1,
angle2: angle2,
angle1_v: 0,
angle2_v: 0,
gravity: 0.5,
update: function() {
const num1 = -this.gravity * (2 * this.length1 * m1 + m2) * sin(this.angle1);
const num2 = -m2 * this.gravity * sin(this.angle1 - 2 * this.angle2);
const num3 = -2 * sin(this.angle1 - this.angle2) * m2;
const num4 = this.angle2_v * this.angle2_v * this.length2 + this.angle1_v * this.angle1_v * this.length1 * cos(this.angle1 - this.angle2);
const den = this.length1 * (2 * m1 + m2 - m2 * cos(2 * this.angle1 - 2 * this.angle2));
const angle1_a = (num1 + num2 + num3 * num4) / den;
const num5 = 2 * sin(this.angle1 - this.angle2);
const num6 = (this.angle1_v * this.angle1_v * this.length1 * (m1 + m2));
const num7 = this.gravity * (m1 + m2) * cos(this.angle1);
const num8 = this.angle2_v * this.angle2_v * this.length2 * m2 * cos(this.angle1 - this.angle2);
const den2 = this.length2 * (2 * m1 + m2 - m2 * cos(2 * this.angle1 - 2 * this.angle2));
const angle2_a = (num5 * (num6 + num7 + num8)) / den2;
this.angle1_v += angle1_a;
this.angle2_v += angle2_a;
this.angle1 += this.angle1_v;
this.angle2 += this.angle2_v;
},
draw: function() {
const x1 = this.x + this.length1 * sin(this.angle1);
const y1 = this.y + this.length1 * cos(this.angle1);
const x2 = x1 + this.length2 * sin(this.angle2);
const y2 = y1 + this.length2 * cos(this.angle2);
stroke(0);
line(this.x, this.y, x1, y1);
line(x1, y1, x2, y2);
fill(0);
ellipse(x1, y1, m1, m1);
ellipse(x2, y2, m2, m2);
}
};
return p;
}