Essayez de changer la longueur de bras, la masse et l'angle de départ de chaque pendule si vous le souhaitez.
Code : Tout sélectionner
#ArmLength1=100:#ArmLength2=120
#Mass1=3:#Mass2=2
#MaxHistoricNumber=200
;departure angles
Angle1.f=-#PI/2:Angle2.f=-#PI/2
#x=800:#y=600
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or OpenWindow(0, 0, 0, #X, #Y, "Double Pendulum", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)=0 Or OpenWindowedScreen(WindowID(0),0,0,#X,#Y,0,0,0,#PB_Screen_WaitSynchronization)=0
MessageRequester("Error", "Can't open the sprite system", 0)
End
EndIf
Structure xy
x.i
y.i
EndStructure
NewList trace.xy()
x0.i=#x/2:y0.i=#y/2:x1.i=0:y1.i=0:x2.i=0:y2.i=0
acceleration1.f=0.0:acceleration2.f=0.0
vitesse1.f=0:vitesse2.f=0
g.f=1
Repeat
FlipBuffers()
ClearScreen(#Black)
ExamineKeyboard()
num1.f=-g*(2*#Mass1+#Mass2)*Sin(Angle1)
num2.f=-g*#Mass2*Sin(Angle1-2*Angle2)
num3.f=-2*#Mass2*Sin(Angle1-Angle2)
num4.f=vitesse2*vitesse2*#ArmLength2+vitesse1*vitesse1*#ArmLength1*Cos(Angle1-Angle2)
num.f=num1+num2+num3*num4
den.f=2*#Mass1+#Mass2-#Mass2*Cos(2*Angle1-2*Angle2)
den.f=den*#ArmLength2
acceleration1=num/den
num1.f=2*Sin(Angle1-Angle2)
num2.f=vitesse1*vitesse1*#ArmLength1*(#Mass1+#Mass2)
num3.f= g*(#Mass1+#Mass2)*Cos(Angle1)
num4.f=vitesse2*vitesse2*#ArmLength2*#Mass2*Cos(Angle1-Angle2)
num.f=(num2+num3+num4)
num=num1*num
den.f =#ArmLength2*(2*#Mass1+#Mass2-(#Mass2*Cos(2*Angle1-2*Angle2)))
acceleration2=num/den
vitesse1+acceleration1
vitesse2+acceleration2
Angle1+vitesse1
Angle2+vitesse2
x1=x0+#ArmLength1*Sin(Angle1)
y1=y0+#ArmLength1*Cos(Angle1)
x2=x1+#ArmLength2*Sin(Angle2)
y2=y1+#ArmLength2*Cos(Angle2)
If FirstElement(trace())
xold.i=trace()\x:yold.i=trace()\y
If ListSize(trace())>#MaxHistoricNumber:DeleteElement(trace()):EndIf
LastElement(trace())
EndIf
AddElement(Trace())
Trace()\x=x2
Trace()\y=y2
StartDrawing(ScreenOutput())
ForEach trace()
colorR.i=ListIndex(trace())*255/ListSize(trace())
LineXY(trace()\x,trace()\y,xold,yold,RGB(colorR,0,0))
xold=trace()\x:yold=trace()\y
Next
LineXY(x0,y0,x1,y1,#White)
LineXY(x1,y1,x2,y2,#White)
Circle(x1,y1,#Mass1)
Circle(x2,y2,#Mass2)
StopDrawing()
While WindowEvent():Wend
Until KeyboardPushed(#PB_Key_Escape)