Une épidémie de tremblante du canard fou qui boite (syndrome du touistegaine aggravé) ravage la planète!
L'Europe décide d'envoyer un satellite pour détecter les derniers canards sains : le PureSat_One (nom donné en raison du langage informatique utilisé par l'Aérospatiale et la NASA depuis 2007)
D'après Newton, un projectile imaginaire lancé horizontalement du sommet d'une haute montagne se satellise si la valeur de sa vitesse initiale est suffisante!
Ben j'ai essayé (pas pour de vrai voyons!!!)
Sur papier on travaille avec un repère lié au satellite (la base de Frenet), là j'ai fait sans.
Je n'ai pas tenu compte des frottements (j'essayerai plus tard)
La physique nous donne (F, a, ex,ey et er(vecteur dirigé selon le rayon de l'orbite) sont des vecteurs):
F=m.a=-G.m(sat).M(terre)/r2.er
c'est à dire
a = constante/r2.er
j'ai pris a=dv/dt
er=ex.cosq+ey.sinq avec cosq=x/sqr(x2+y2) et sinq=y/sqr(x2+y2)
Ensuite j'ai utilisé la méthode d'Euler pour calculer vx, vy, x, y par petites variations.
Exemple: vx(i+1)=vx(i)+constante*x/sqr(x2+y2)3*dt
et x(i+1)=x(i)+vx(i)*dt
Le plus délicats a été le changement d'échelle:
j'ai pris 128 pixels = rayon moyen de la Terre=6380000 m
Code : Tout sélectionner
;**********constante **********
#pi=3.1415927
#LargeurEcran=896
#HauteurEcran=600
#rayon_terre=128
#coeff_gravitation=-160548.26 ; -G*Masse_Terre*#rayon_terre^2/Rayon_Terre^2
;*****************variables utilisées********************
;*****************pour dessiner le fond d'écran**********
x_tache.f=0
y_tache.f=0
r_tache.f=0
;****************pour le satellite************************
x_PureSat_One.f=432
y_PureSat_One.f=110
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
altitude.f=40
v_PureSat_One.f=35
Angle_PureSat_One=45
vx_PureSat_One.f=0
vy_PureSat_One.f=0
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2)); rayon de l'orbite
dt.f=0.08 ;pas de calcul
pause.l=1; 1:pause 0:relance
depart.l=0; 1: lancement 0: retour à la base!
trace.l=0; 1:tracer 0:effacer
Enumeration
#spr_background
#spr_PureSat_One
#spr_calque
#spr_calquevierge
EndEnumeration
;*****************initialisation**************************
InitKeyboard()
InitSprite()
InitSprite3D()
;*****************écrans*********************************
OpenWindow(1,1,1,#LargeurEcran,#HauteurEcran+20,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Appuyez sur F1 puis Départ pour paramétrer et réussir la mise en orbite du satellite!"); on ouvre une fenêtre
OpenWindowedScreen(WindowID(1),0,0,#LargeurEcran,#HauteurEcran,0,1,1); on met un écran dedans
LoadFont(1,"Papyrus",11,#PB_Font_HighQuality|#PB_Font_Bold )
;************** sprite fond d'écran**********************
CreateSprite(#spr_background,#LargeurEcran,#HauteurEcran)
StartDrawing(SpriteOutput(#spr_background))
For tache =1 To 1000 ; fond étoilé
x_tache=Random(#LargeurEcran-5)
y_tache=Random(#HauteurEcran-5)
Plot(x_tache,y_tache,RGB(Random(50)+200,Random(50)+200,Random(100)+150))
Next tache
Circle(#LargeurEcran/2,#HauteurEcran/2,128,RGB($0,$4A,$95));globe+montagne
LineXY(428,175,458,175,RGB($0,$4A,$95))
LineXY(458,175,448,156,RGB($0,$4A,$95))
LineXY(448,156,440,168,RGB($0,$4A,$95))
LineXY(440,168,435,162,RGB($0,$4A,$95))
LineXY(435,162,428,175,RGB($0,$4A,$95))
FillArea(448,168,RGB($0,$4A,$95),RGB($80,$80,$0))
For tache =1 To 600; taches sur le globe
x_tache=Random(256)
y_tache=Random(256)
r_tache=Random(8)
If (Pow((x_tache+320-#LargeurEcran/2),2)+Pow((y_tache+172-#HauteurEcran/2),2))<Pow(#rayon_terre-8,2)
Circle(x_tache+320,y_tache+172,r_tache,RGB(Random(180),$80,$0))
EndIf
Next tache
StopDrawing()
;**********************sprite PureSat_One*********************************
CreateSprite(#spr_PureSat_One,32,32,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(#spr_PureSat_One))
LineXY(8,16,24,16,RGB($40,$80,$80))
Circle(16,16,5,RGB($80,$80,$80))
Box(0,10,8,12,RGB($61,$AF,$AF))
Box(24,10,8,12,RGB($61,$AF,$AF))
LineXY(16,10,16,8,RGB($FF,$80,$0))
Circle(16,7,2,RGB($FF,$0,$0))
StopDrawing()
CreateSprite3D(#spr_PureSat_One,#spr_PureSat_One)
;**********sprite calque******************************
CreateSprite(#spr_calque,#LargeurEcran,#HauteurEcran)
;**********sprite calquevierge********************
CreateSprite(#spr_calquevierge,#LargeurEcran,#HauteurEcran)
;***************************gadgets********************
CreateGadgetList(WindowID(1))
ButtonGadget(1,0,#HauteurEcran,90,20,"Départ" )
ButtonGadget(2,90,#HauteurEcran,90,20,"Pause/Reprise")
ButtonGadget(3,180,#HauteurEcran,90,20,"Tracer/Effacer")
ButtonGadget(4,270,#HauteurEcran,90,20,"Quitter")
;*****************************************************
Repeat ; boucle principale
Repeat
event = WindowEvent()
Delay(1)
Select event
Case #PB_Event_CloseWindow
End
Case #PB_EventGadget
Select EventGadgetID()
Case 1 ;initialisation ou retour à la base!
x_PureSat_One.f=432
y_PureSat_One.f=150-altitude
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2))
vx_PureSat_One=v_PureSat_One*Cos(-Angle_PureSat_One*#pi/180)
vy_PureSat_One=v_PureSat_One*Sin(-Angle_PureSat_One*#pi/180)
i=0
depart=depart+1
pause=0
If depart>1
depart=0
EndIf
Case 2; appuie sur pause
pause=pause+1
If pause>1
pause=0
EndIf
Case 3; appuie sur tracer/effacer
trace=trace+1
If trace>1
trace=0
EndIf
Case 4; fin
End
EndSelect
EndSelect
Until event = #Null
; menu interactif pour le paramétrage du satellite
If ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
pause=1
depart=0
v_PureSat_One=ValF(InputRequester("Conditions initiales","Donnez la vitesse de lancement (1 unité ~ 0,233 km/s) :",StrF(v_PureSat_One)) )
Angle_PureSat_One=ValF(InputRequester("Conditions initiales","Donnez l'angle de lancement(0~360) :",StrF(Angle_PureSat_One)))
altitude=ValF(InputRequester("Conditions initiales","Donnez l'altitude (1 unité ~ 49,8 km) :",StrF(altitude)))
x_PureSat_One=432
y_PureSat_One=150-altitude
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2))
vx_PureSat_One=v_PureSat_One*Cos(-Angle_PureSat_One*#pi/180)
vy_PureSat_One=v_PureSat_One*Sin(-Angle_PureSat_One*#pi/180)
i=0
EndIf
EndIf
;********************angle de rotation du sprite***************************************************************
If pause=0 And depart=1
i=i+1
If i>=360
i=0
EndIf
;**********calcul des coordonnées**********
r_PureSat_One=Sqr(Pow((x_PureSat_One-432),2)+Pow((y_PureSat_One-284),2))
If r_PureSat_One>#rayon_terre+2 ; si le satellite ne touche pas le sol
vx_PureSat_One=vx_PureSat_One+#coeff_gravitation*(x_PureSat_One-432)*dt/Pow(r_PureSat_One,3)
vy_PureSat_One=vy_PureSat_One+#coeff_gravitation*(y_PureSat_One-284)*dt/Pow(r_PureSat_One,3)
old_x_PureSat_One=x_PureSat_One
old_y_PureSat_One=y_PureSat_One
x_PureSat_One=x_PureSat_One+vx_PureSat_One*dt
y_PureSat_One=y_PureSat_One+vy_PureSat_One*dt
Else
pause=1
depart=2
r_PureSat_One=134
EndIf
EndIf
;******************************affichage des sprites et du texte*************
DisplaySprite(#spr_background,0,0)
StartDrawing(ScreenOutput())
DrawingFont(FontID())
FrontColor(255,255,255)
DrawingMode(1)
Locate(0,0)
DrawText("Altitude h= "+StrF((r_PureSat_One-134)*6380/128)+" km")
If depart=1
Locate(0,20)
DrawText("Vitesse v= "+StrF(Sqr(Pow(vx_PureSat_One,2)+Pow(vy_PureSat_One,2))*Sqr(6380000/128)/1000)+" km/s")
Else
Locate(0,20)
DrawText("Vitesse v= 0 km/s ")
EndIf
StopDrawing()
Start3D()
RotateSprite3D(#spr_PureSat_One,i*6,0)
DisplaySprite3D(#spr_PureSat_One,x_PureSat_One,y_PureSat_One)
Stop3D()
;*********tracé des trajectoires****************
If trace=1
StartDrawing(SpriteOutput(#spr_calque))
If x_PureSat_One+16>=0 And x_PureSat_One+16<(#LargeurEcran-1) And y_PureSat_One+16>=0 And y_PureSat_One+16<(#HauteurEcran-1)
LineXY(old_x_PureSat_One+16, old_y_PureSat_One+16,x_PureSat_One+16,y_PureSat_One+16,RGB($FF,$FF,$0))
EndIf
StopDrawing()
EndIf
If trace=1
DisplayTransparentSprite(#spr_calque,0,0)
Else
CopySprite(#spr_calquevierge,#spr_calque)
EndIf
;******************************************************************
FlipBuffers ()
ForEver
Par défaut le satellite se crashe, c'est à vous de donner la bonne vitesse initiale(c'est pas trop dur!!!)!
Questions:
1. j'ai pas oublié des bugs (ou mis des trucs en trop)???
2.Lorsque le programme fonctionne, si on bouge la souris, ça perturbe le satellite! Est-ce normal?
3. Si vous avec des idées .....
Merci d'avance!