1
0
mirror of https://gitlab.com/MisterBiggs/double_pendulum.git synced 2025-06-15 14:36:42 +00:00
double_pendulum/doublependulum.pde
2019-07-26 03:46:33 -07:00

92 lines
2.4 KiB
Plaintext

// Daniel Shiffman
// http://codingtra.in
// http://patreon.com/codingtrain
// Double Pendulum
// https://youtu.be/uWzPe_S-RVE
float r1 = 200; // length of first pendulum
float r2 = 200; // length of second pendulum
float m1 = 40; // mass of first pendulum excluding weight of string
float m2 = 40; // mass of second pendulum excluding weight of string
float a1 = PI/2; // angle formed by first pendulum and normal - angle1
float a2 = PI/2; //angle formed by second pendulum and normal - angle2
float a1_v = 0; //angular velocity of pendulum1
float a2_v = 0; //angular velocity of pendulum2
float g = 1; //gravitational constant (realistic value not considered for simplicity )
float px2 = -1; // previous position of second pendulum sphere - x offset
float py2 = -1; // previos position of second pendulum sphere - y offset
float cx, cy; //centre of x and y for background
PGraphics canvas; // canvas is just a variable name DO NOT CONFUSE IT WITH P5.JS
void setup() {
size(900, 600);
cx = width/2;
cy = 200;
canvas = createGraphics(width, height);
canvas.beginDraw();
canvas.background(255);
canvas.endDraw();
}
void draw() {
background(255);
imageMode(CORNER);
image(canvas, 0, 0, width, height);
// numerators are moduled
float num1 = -g * (2 * m1 + m2) * sin(a1);
float num2 = -m2 * g * sin(a1-2*a2);
float num3 = -2*sin(a1-a2)*m2;
float num4 = a2_v*a2_v*r2+a1_v*a1_v*r1*cos(a1-a2);
float den = r1 * (2*m1+m2-m2*cos(2*a1-2*a2));
float 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));
float a2_a = (num1*(num2+num3+num4)) / den;
translate(cx, cy);
stroke(0);
strokeWeight(2);
float x1 = r1 * sin(a1);
float y1 = r1 * cos(a1);
float x2 = x1 + r2 * sin(a2);
float 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;
// as momentum increases , slowly pendulum comes to rest
// a1_v *= 0.99; // for drag
// a2_v *= 0.99; // for drag
canvas.beginDraw();
//canvas.background(0, 1);
canvas.translate(cx, cy);
canvas.stroke(0);
if (frameCount > 1) {
canvas.line(px2, py2, x2, y2);
}
canvas.endDraw();
px2 = x2;
py2 = y2;
}