Dans le cadre de mon projet avec le lycée, je me suis dit, allons donc faire un petit algo tranquillou cool bill!
Hé ben y a plein de trucs louches dans mon prog, ça doit être l'effet vacances???!
Code : Tout sélectionner
;***************variables utilisées**********************
xs.f=0; pour le soleil
ys.f=0
xt.f=0; pour la terre
yt.f=0
xl.f=0; pour la lune
yl.f=0
rt.f=160; rayon de l'orbite terrestre
rl.f=50; rayon de l'orbite lunaire
theta.f=0; angle pour la rotation de la terre
phi.f=0; angle pour la rotation de la lune
psi.f=0; angle de rotation de la lune par rapport au soleil
pi.f=3.1415927
;*************initialisation**********************
InitSprite()
InitMouse ()
InitSprite3D ()
OpenWindow (1, 1,1, 600, 500, #PB_Window_SystemMenu , "test" ) ; on ouvre une fenetre
OpenWindowedScreen ( WindowID (1) , 0, 0, 600, 500, 1, 1, 1) ; on met un ecran dedans !!
;***********************sprite terre***************************************
CreateSprite (1,32,32) ;terre éclairée sprite 32*32
StartDrawing ( SpriteOutput (1))
Circle (16,16, 16, RGB(33, 218, 222))
StopDrawing ()
CreateSprite (2,32,32) ; terre non éclairée sprite 32*32
StartDrawing ( SpriteOutput (2))
Circle (16,16, 16, RGB(26, 17, 178))
StopDrawing ()
ClipSprite(1,0,0,16,32);découpage terre éclairée
ClipSprite(2,16,0,16,32); découpage terre non éclairée
DisplaySprite(1,100,100);affichage des deux sprites
DisplaySprite(2,116,100)
GrabSprite(3,100,100,32,32,#PB_Sprite_Texture) ;capture d'écran et création du sprite(3) terre
; moitié éclairée moitié sombre
CreateSprite3D(1,3)
;******************************sprite lune**************************************
CreateSprite (4,16,16) ;lune éclairée sprite 16*16
StartDrawing ( SpriteOutput (4))
Circle (8,8,8, RGB(235, 235, 235))
StopDrawing ()
CreateSprite (5,16,16) ; lune non éclairée sprite 16*16
StartDrawing ( SpriteOutput (5))
Circle (8,8, 8, RGB(115, 115, 115))
StopDrawing ()
ClipSprite(4,0,0,8,16);découpage lune éclairée
ClipSprite(5,8,0,8,16); découpage lune non éclairée
DisplaySprite(4,100,132);affichage des deux sprites
DisplaySprite(5,108,132)
GrabSprite(6,100,132,16,16,#PB_Sprite_Texture) ;capture d'écran et création du sprite(6) lune
CreateSprite3D(2,6)
;*********************************** sprite soleil******************************
CreateSprite (7,64,64)
StartDrawing ( SpriteOutput (7))
Circle(32,32,32,RGB(249, 244, 89))
StopDrawing ()
;***************************programme principal****************************************
Repeat ; boucle principale
Event= WaitWindowEvent () ; on regarde si quelqu'un a cliqué sur la croix pour quitter
For i =0 To 360
ExamineMouse ()
If MouseButton (2) ; le bouton de souris droit fait quitter !
End
EndIf
Start3D(); utilisation des effets de la 3D pour la rotation des sprites
xs=260 ;position du soleil
ys=210
; ***********calcul des trajectoires*************
theta=pi*i/180 ;conversions en radians
phi=pi*i/15
xt=xs+rt*Cos(-theta)+16; coords de la terre
yt=ys+rt*Sin(-theta)+16
xl=xt+rl*Cos(-phi)+8; coords de la lune
yl=yt+rl*Sin(-phi)+8
If (xl-xs)>0 ;phénomènes mystiques avec l'arctangente!
psi=180*ATan((yl-ys)/(xl-xs))/pi
EndIf
If (xl-xs)<0
psi=180*(ATan((yl-ys)/(xl-xs))/pi-1); surtout ici! faut que je révise ma trigo!
EndIf
;****************affichage des sprites***************************
RotateSprite3D(1,-theta*180/pi,0); rotation de la terre avec l'angle en degrés
RotateSprite3D(2,psi,0) ; rotation de la Lune
DisplaySprite(7,xs,ys) ; affichage soleil
DisplaySprite3D(1,xt,yt) ; affichage terre
DisplaySprite3D(2,xl,yl) ; affichage lune
FlipBuffers () ; <---- ceci pour voir le dessin se faire +Lent !!
ClearScreen (0, 0, 0) ; <--- ceci efface l'ecran !!
Delay(50)
Next i
Stop3D()
Until Event= #PB_Event_CloseWindow
Return
Le premier truc que j'ai oublié c'est que tout est à l'envers sur l'ordi (x,y,les angles...)
Pour le calcul des trajectoires j'ai utilisé le galilée style cad la relativité des mouvements (exemple:
légende T terre, L lune, S soleil, > vecteur
SL>=ST>+TL>
cad xsl=xst+xtl et ysl=yst+ytl)
Vu que l'objectif final est de voir et comprendre les phases de la Lune , j'ai considéré que toutes les trajectoires étaient circulaires, je n'ai respecté aucune échelle.
Ensuite je voulais créer les sprites dans le prog , j'ai tenu compte de l'éclairage du Soleil (j'ai fait comme j'ai pu avec le découpage/assemblage/rotation des sprites!)
Pour les trajectoires j'ai pris les relations classiques avec cos et sin
Cependant, ...pour l'éclairage de la Lune, il me fallait l'angle de rotation de la Lune par rapport au Soleil(psi) et Là... j'ai utilisé l'arctangente(il doit y avoir plus propre mais j'ai pas trouvé).
Bilan quand l'angle est égal à 270 et 90 degrés(même si j'interdis le calcul à l'ordi), si je rajoute pas des choses la Lune fait un double axel et un saut périlleux de 180°!
Si vous voyez des choses louches(il y en a) faites le moi savoir SVP
Au niveau des modifs j'accepte ttes propositions(mais je devrais simplifier car je dois expliquer tout ça à des élèves!!!)
Encore merci pour tous vos conseils!