Pendule double
Publié : dim. 01/juil./2018 20:10
https://fr.wikipedia.org/wiki/Pendule_double
Essayez de changer la longueur de bras, la masse et l'angle de départ de chaque pendule si vous le souhaitez.
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)