Newton 2016.....featuring PureSat_One!

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Newton 2016.....featuring PureSat_One!

Message par Huitbit »

An 2016...
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!
Dernière modification par Huitbit le ven. 20/janv./2006 2:17, modifié 6 fois.
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

il bouge pas ton sat !!

il monte , pis il reste fixe ! :? la vitesse reste a zero !!

sinon apres ton "event = WindowEvent() "
ajoute une ligne : "Delay(20)"
pour pas que ton aplication prenne tout le temps machine

lance ton appli et fait un CTRL+ALT+SUPR (1 seul fois) dans la liste des apli
(processus) tu aura le temps machine pris par ton prg "purebasic xxxx.exe" !!

compare entre les deux versions :D
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

??????

Message par Huitbit »

8O ??
Pour lancer mon satellite, il faut cliquer sur
DEPART!

Je ne voulais pas que le démarrage soit automatique!
J'espère que c'était juste ça sinon, je comprend plus rien car chez moi ça tourne sans problème!

Par contre tu soulèves un problème qui est souvent abordé dans les forums et qui n'est jamais clair à 100% pour moi.
c'est la différence entre waitwindowevent() et windowevent() :mad:

Dans l'aide on conseille waitwindowevent() et souvent dans les progs on trouve windowevent() !!!!

A+
@Dobro: et ce jeu en relief? Ceux qui codent en 3D n'ont pas besoin d'appareil photo pour faire des images décalées?!
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

waitwindowevent() attend qu'un evenement soit actionné !
en clair la boucle principale de ton prg ne fonctionne que si un evenement est provoqué (bouge la souris , clique , ect ..)



windowevent() (multitache) rend la main au system en permanence
la boucle principale est effectuée tout le temps
ce qui permet l'affichage de sprite animé dans une fenetre de ton prg sans bloquer ..
c'est pourquoi il faut "arreter" ta boucle principale avec un Delay()
sinon tu bouffe beaucoup de ressource du system
pendant ce delay() ta boucle principale sera arreté,ton prg va rendre la main au system
qui fera ce qu'il a a faire avant de retomber dans ta boucle..
bref ton appli deviens "Multitache" :D ..
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

je suis arrive a le mettre en orbite

42
10
30

:D marran ton truc !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Par contre, dobro, il rase juste la terre !
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Ouf!!!!!

Message par Huitbit »

Merci pour ton petit résumé!
Je vais le mettre de côté!

Au fait, il y a beaucoup de solutions (moi j'aime bien le canard et le confit de canard!!)! :P
Même si le satellite sort de l'écran, il peut revenir quelque temps après(un peu comme la comète de Halley!)

@Progi1984 :
c'est à cause de l'échelle, 1 pixel~50 km!!
C'est vrai que dès fois on dirait qu'il ramasse carrément les canards :lol:


Hasta la vista!
Elevé au MSX !
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Au fait!

Depuis que j'ai mis le delay

(j'ai mis delay(1))

il n'y a plus de problèmes avec la souris!
Pour les ressources machine je suis encore haut(97~100%) mais mon prloblème c'était la souris!
Donc plus de problèmes!!!


Super!!!
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Pour les ressources machine je suis encore haut(97~100%)
met un delay(20) ! :)
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

I'm not a rebel!!!

Message par Huitbit »

J'ai essayé avec delay(20),
pour le processeur c'est nickel par contre si tu bouges la souris en pleine action ( :lol: ), l'affichage est saccadé!
C'est pour cela que j'ai mis delay(1).

Je n'y connais rien mais, est-ce que c'est grave que le processeur tourne au dessus de 90%?


PS: dans le premier message il y a une chtite faute de frappe: il faut lire
cosq=x/racine(x2+y2) et sinq=y/racine(x2+y2) au lieu de cosq=x/(x2+y2)2 et sinq=y/(x2+y2)2

idem vx(i+1)=vx(i)+constante*x/racine(x2+y2)3*dt
Elevé au MSX !
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Pour les fautes : Il suffisait d'éditer ton post et personne n'y aurait vu que du feu! (de la comète) :D
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Pssssssst!

Message par Huitbit »

Editer ton post
kézako? 8O
Elevé au MSX !
Avatar de l’utilisateur
Mindphazer
Messages : 695
Inscription : mer. 24/août/2005 10:42

Message par Mindphazer »

Ben quand tu écris un post, si tu te rends compte que t'as fait une faute d'orthographe, ou bien que tu te rends compte que t'as écrit une méga-bourde, tu peux éditer ton post pour le corriger.....
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

J'ai réussi a le mettre en orbite mais le résultat est bizarre
(un petit arriere gout d'armageddon)

vitesse 33
angle 15
altitude 50

ah bah ca fonctionne mieux comme ca :

vitesse 34
angle 0
altitude 50

Dri :10:
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Question interrogative

Message par Huitbit »

Je vais passer pour un australopithèque fatigué après une journée de chasse au canard fièvreux mais....

Comment on fait pour éditer son post? :?
Elevé au MSX !
Répondre