mirror of
https://gitlab.com/MisterBiggs/double_pendulum.git
synced 2025-06-15 14:36:42 +00:00
init commit
This commit is contained in:
commit
4b5d35cecd
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Double Pendulum In Processing.py
|
||||
|
||||
Simple Port of the marvelous Daniel Shiffman from The Coding Train's double pendulum Processing sketch to Python.
|
||||
|
||||

|
BIN
animation.webm
Normal file
BIN
animation.webm
Normal file
Binary file not shown.
BIN
double_pendulum.mkv
Normal file
BIN
double_pendulum.mkv
Normal file
Binary file not shown.
80
double_pendulum.py
Normal file
80
double_pendulum.py
Normal file
@ -0,0 +1,80 @@
|
||||
def setup():
|
||||
size(900, 600)
|
||||
global canvas, cx, cy
|
||||
cx = width / 2
|
||||
cy = 200
|
||||
canvas = createGraphics(width, height)
|
||||
canvas.beginDraw()
|
||||
canvas.background(255)
|
||||
canvas.endDraw()
|
||||
|
||||
global r1, r2, m1, m2, a1, a2, a1_v, a2_v, g, px2, py2
|
||||
r1 = 200
|
||||
r2 = 200
|
||||
m1 = 40
|
||||
m2 = 40
|
||||
a1 = PI / 2
|
||||
a2 = PI / 2
|
||||
a1_v = 0
|
||||
a2_v = 0
|
||||
g = 1
|
||||
|
||||
px2 = -1
|
||||
py2 = -1
|
||||
|
||||
|
||||
def draw():
|
||||
|
||||
background(255)
|
||||
imageMode(CORNER)
|
||||
image(canvas, 0, 0, width, height)
|
||||
global r1, r2, m1, m2, a1, a2, a1_v, a2_v, g, px2, py2
|
||||
num1 = -g * (2 * m1 + m2) * sin(a1)
|
||||
num2 = -m2 * g * sin(a1 - 2 * a2)
|
||||
num3 = -2 * sin(a1 - a2) * m2
|
||||
num4 = a2_v * a2_v * r2 + a1_v * a1_v * r1 * cos(a1 - a2)
|
||||
den = r1 * (2 * m1 + m2 - m2 * cos(2 * a1 - 2 * a2))
|
||||
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))
|
||||
a2_a = (num1 * (num2 + num3 + num4)) / den
|
||||
|
||||
translate(cx, cy)
|
||||
stroke(0)
|
||||
strokeWeight(2)
|
||||
|
||||
x1 = r1 * sin(a1)
|
||||
y1 = r1 * cos(a1)
|
||||
|
||||
x2 = x1 + r2 * sin(a2)
|
||||
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
|
||||
|
||||
canvas.beginDraw()
|
||||
canvas.translate(cx, cy)
|
||||
canvas.stroke(0)
|
||||
|
||||
if frameCount > 1:
|
||||
canvas.line(px2, py2, x2, y2)
|
||||
|
||||
canvas.endDraw()
|
||||
|
||||
px2 = x2
|
||||
py2 = y2
|
||||
|
78
double_pendulum.pyde
Normal file
78
double_pendulum.pyde
Normal file
@ -0,0 +1,78 @@
|
||||
|
||||
def setup():
|
||||
size(900, 600)
|
||||
global canvas, cx, cy
|
||||
cx = width / 2
|
||||
cy = 200
|
||||
canvas = createGraphics(width, height)
|
||||
canvas.beginDraw()
|
||||
canvas.background(255)
|
||||
canvas.endDraw()
|
||||
global r1, r2, m1, m2, a1, a2, a1_v, a2_v, g, px2, py2
|
||||
r1 = 200
|
||||
r2 = 200
|
||||
m1 = 40
|
||||
m2 = 40
|
||||
a1 = PI / 2
|
||||
a2 = PI / 2
|
||||
a1_v = 0
|
||||
a2_v = 0
|
||||
g = 1
|
||||
|
||||
px2 = -1
|
||||
py2 = -1
|
||||
|
||||
def draw():
|
||||
|
||||
background(255)
|
||||
imageMode(CORNER)
|
||||
image(canvas, 0, 0, width, height)
|
||||
global r1, r2, m1, m2, a1, a2, a1_v, a2_v, g, px2, py2
|
||||
num1 = -g * (2 * m1 + m2) * sin(a1)
|
||||
num2 = -m2 * g * sin(a1 - 2 * a2)
|
||||
num3 = -2 * sin(a1 - a2) * m2
|
||||
num4 = a2_v * a2_v * r2 + a1_v * a1_v * r1 * cos(a1 - a2)
|
||||
den = r1 * (2 * m1 + m2 - m2 * cos(2 * a1 - 2 * a2))
|
||||
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))
|
||||
a2_a = (num1 * (num2 + num3 + num4)) / den
|
||||
|
||||
translate(cx, cy)
|
||||
stroke(0)
|
||||
strokeWeight(2)
|
||||
|
||||
x1 = r1 * sin(a1)
|
||||
y1 = r1 * cos(a1)
|
||||
|
||||
x2 = x1 + r2 * sin(a2)
|
||||
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
|
||||
|
||||
canvas.beginDraw()
|
||||
canvas.translate(cx, cy)
|
||||
canvas.stroke(0)
|
||||
|
||||
if frameCount > 1:
|
||||
canvas.line(px2, py2, x2, y2)
|
||||
|
||||
canvas.endDraw()
|
||||
|
||||
px2 = x2
|
||||
py2 = y2
|
92
doublependulum.pde
Normal file
92
doublependulum.pde
Normal file
@ -0,0 +1,92 @@
|
||||
// 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;
|
||||
}
|
2
sketch.properties
Normal file
2
sketch.properties
Normal file
@ -0,0 +1,2 @@
|
||||
mode=Python
|
||||
mode.id=jycessing.mode.PythonMode
|
Loading…
x
Reference in New Issue
Block a user