Sorry your browser is not supported!

You are using an outdated browser that does not support modern web technologies, in order to use this site please update to a new browser.

Browsers supported include Chrome, FireFox, Safari, Opera, Internet Explorer 10+ or Microsoft Edge.

DarkBASIC Professional Discussion / Double pendulum not quite right :-( Processing code included) Help !

Author
Message
Hannibal
17
Years of Service
User Offline
Joined: 5th Mar 2007
Location:
Posted: 7th Dec 2023 21:00
I have been thru it many times and it seems correct, but can't be :-(

[/code]
set display mode 1920,1080,32

sync on :sync rate 60
autocam off


r1#=125.0
r2#=125.0
m1#=10.0
m2#=10.0
a1#=90.0
a2#=90.0
a1_v# = 0.0
a2_v# = 0.0
`a1_a# = 1
`a2_a# = 1
g# = 1.0

px2# = -1.0
py2# = -1.0
`````````````````````````````````

do
cls

inc delay

ink rgb(0,200,0)
`text 20,20,str$(screen fps())+" "+str$(a)+" "+str$(1920/120)


num1# = -g# * (m1# + m2# * 2) * 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#


num11# = 2 * sin(a1# - a2#)
num21# = ((a1_v# * a1_v#) * r1# * (m1# + m2#))
num31# = g# * (m1# + m2#) * cos(a1#)
num41# = a2_v# * a2_v# * r2# * m2# * cos(a1# - a2#)
den1# = r2# * (2 * m1# + m2# - m2# * cos(2 * a1# - 2 * a2#))
a2_a# = (num11# * (num21# + num31# + num41#)) / den1#

remstart
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;
remend

` translate(cx, cy);
` stroke(0);
` strokeWeight(2);

x1# =960 + r1# * sin(a1#)
y1# =250 + r1# * cos(a1#)

x2# = x1# + r2# * sin(a2#)
y2# = y1# + r2# * cos(a2#)

line 960,250,x1#,y1#
line x1#,y1#,x2#,y2#


a1_v# = a1_v#+a1_a#
a2_v# = a2_v#+a2_a#
a1# = a1# +a1_v#
a2# = a2# +a2_v#

` a1_v# = a1_v# *0.9995
` a2_v# = a2_v# *0.9995

` px2# = x2#
` py2# = y2#

ttt:
if inkey$()=" " then goto ttt
sync
loop
[code lang=dbp]


Original code...

// Daniel Shiffman
// https://thecodingtrain.com/CodingChallenges/093-double-pendulum.html
// https://youtu.be/uWzPe_S-RVE

let r1 = 125;
let r2 = 125;
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;

function setup() {
createCanvas(500, 300);
//Issue with wrong rendering on a retina Mac. See issue: https://github.com/CodingTrain/website/issues/574
pixelDensity(1);
a1 = PI / 2;
a2 = PI / 2;
cx = width / 2;
cy = 50;
buffer = createGraphics(width, height);
buffer.background(175);
buffer.translate(cx, cy);
}

function draw() {
background(175);
imageMode(CORNER);
image(buffer, 0, 0, width, height);

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(0);
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.99;
// a2_v *= 0.99;

buffer.stroke(0);
if (frameCount > 1) {
buffer.line(px2, py2, x2, y2);
}

px2 = x2;
py2 = y2;
}

BillR
21
Years of Service
User Offline
Joined: 19th Mar 2003
Location: United States
Posted: 4th Jan 2024 11:58 Edited at: 5th Jan 2024 03:20
//[/code]
//set display mode 1920,1080,8
set display mode 1600,900,32

sync on :sync rate 60
autocam off


r1#=125.0
r2#=125.0
m1#=10.0
m2#=10.0
a1#=90.0
a2#=90.0
a1_v# = 0.0
a2_v# = 0.0
`a1_a# = 1
`a2_a# = 1
g# = 1.0

px2# = -1.0
py2# = -1.0
`````````````````````````````````

do
cls

inc delay

ink rgb(0,200,0)
`text 20,20,str$(screen fps())+" "+str$(a)+" "+str$(1920/120)


num1# = -g# * (m1# + m2# * 2) * 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#


num11# = 2 * sin(a1# - a2#)
num21# = ((a1_v# * a1_v#) * r1# * (m1# + m2#))
num31# = g# * (m1# + m2#) * cos(a1#)
num41# = a2_v# * a2_v# * r2# * m2# * cos(a1# - a2#)
den1# = r2# * (2 * m1# + m2# - m2# * cos(2 * a1# - 2 * a2#))
a2_a# = (num11# * (num21# + num31# + num41#)) / den1#

remstart
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;
remend

` translate(cx, cy);
` stroke(0);
` strokeWeight(2);

x1# =960 + r1# * sin(a1#)
y1# =250 + r1# * cos(a1#)

x2# = x1# + r2# * sin(a2#)
y2# = y1# + r2# * cos(a2#)

line 960,250,x1#,y1#
line x1#,y1#,x2#,y2#


a1_v# = a1_v# + a1_a#
a2_v# = a2_v# + a2_a#
a1# = a1# + a1_v#
a2# = a2# + a2_v#

//---Changed dampening to fewer decimal places to 0.999
// ---Thinking small rounding errors could be causing strange behavior, seems to have fixed the problem
a1_v# = a1_v# * 0.999
a2_v# = a2_v# * 0.999

` px2# = x2#
` py2# = y2#

ttt:
if inkey$()=" " then goto ttt
//---Just inserting some debug code here to watch velocities
print "a1_v#=";a1_v#
print "a2_v#=";a2_v#
sync
loop
//[code lang=dbp]
Hannibal
17
Years of Service
User Offline
Joined: 5th Mar 2007
Location:
Posted: 27th Jan 2024 00:18
Many thanks I will look at this with great interest !

Login to post a reply

Server time is: 2024-04-30 22:28:05
Your offset time is: 2024-04-30 22:28:05