xxxxxxxxxx
// Original code from Daniel Shiffman, I've tweaked some things. :)
// Daniel Shiffman
// http://codingtra.in
// http://patreon.com/codingtrain
// Double Pendulum
// https://youtu.be/uWzPe_S-RVE
let r1 = 150;
let r2 = 150;
let m1 = 10;
let m2 = 10;
let a1 = 0;
let a2 = 0;
let a1_v = 0;
let a2_v = 0;
let g = 1;
let px2 = -1;
let py2 = -1;
let cx, cy;
let buffer;
let inkleft = 100;
function mouseClicked() {
saveCanvas('DoublePendulum', 'png');
}
function setup() {
createCanvas(windowWidth, windowHeight);
a1 = PI + random()/100-.005; //random a1
a2 = PI + random()-.5; //random a2
cx = width / 2;
cy = height / 2;
buffer = createGraphics(width, height);
buffer.background(0);
buffer.colorMode(HSB, 256);
buffer.translate(cx, cy);
buffer.strokeWeight(3);
}
function draw() {
background(175);
imageMode(CORNER);
image(buffer, 0, 0, width, height);
if(inkleft > 0) {
for(let i = 0; i < 100; i++) { //How many times per draw loop to progress forward
let num1 = -g * (2 * m1 + m2) * sin(a1);
let num2 = -m2 * g * sin(a1 - 2 * a2);
let num3 = -2 * sin(a1 - a2) * m2;
let num4 = a2_v * a2_v * r2 + a1_v * a1_v * r1 * cos(a1 - a2);
let den = r1 * (2 * m1 + m2 - m2 * cos(2 * a1 - 2 * a2));
let a1_a = (num1 + num2 + num3 * num4) / den;
num1 = 2 * sin(a1 - a2);
num2 = (a1_v * a1_v * r1 * (m1 + m2));
num3 = g * (m1 + m2) * cos(a1);
num4 = a2_v * a2_v * r2 * m2 * cos(a1 - a2);
den = r2 * (2 * m1 + m2 - m2 * cos(2 * a1 - 2 * a2));
let a2_a = (num1 * (num2 + num3 + num4)) / den;
translate(cx, cy);
stroke(255);
strokeWeight(2);
let x1 = r1 * sin(a1);
let y1 = r1 * cos(a1);
let x2 = x1 + r2 * sin(a2);
let y2 = y1 + r2 * cos(a2);
//line(0, 0, x1, y1);
//fill(0);
//ellipse(x1, y1, m1, m1);
//line(x1, y1, x2, y2);
//fill(0);
//ellipse(x2, y2, m2, m2);
a1_v += a1_a;
a2_v += a2_a;
a1 += a1_v;
a2 += a2_v;
a1_v *= 0.9999;
a2_v *= 0.9999;
buffer.stroke(0);
if (frameCount > 1) {
buffer.stroke(map(dist(px2, py2, x2, y2), 0, 30, 0, 256), 256, 256, map(inkleft, 100, 0, 256, 0)); //stroke color changes with speed.
buffer.strokeWeight(map(dist(px2, py2, x2, y2), 0, 30, 5, 1)); //StrokeWeight inversly proportional to thinner when faster.
buffer.line(px2, py2, x2, y2);
}
px2 = x2;
py2 = y2;
}
inkleft--;
}
}