Les phases de la Lune V1.0(ça marche mais c'est chelou!)l

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

Petite amélioration!

Message par Huitbit »

Grâce à l'info de Filperj(dernier sujet sur la cycloïde), j'ai rajouté la possibilité de tracer les trajectoires "en direct"!

J'ai rajouté :
la variable "trace" pour savoir si il fallait tracer ou pas les courbes

le sprite "calque" pour dessiner les trajectoires

le sprite "calque noir" pour écraser le sprite "calque" lorsqu'on revient au mode normal (pour cela j'ai utilisé(et découvert!!!) la fonction copysprite )

j'utilise les mêmes sprites que Cédéravic (voir page 1 du sujet)

j'ai étiré l'écran

j'ai activé la touche F4 (quand on appuie ça trace!)

P.S chez moi j'ai modifié le sprite "background" qui était un peu trop lumineux

Voilà le code:

Code : Tout sélectionner

;***************variables utilisées********************** 
xs.f=260;   pour le soleil 
ys.f=220 

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 
psi1.f=0; variable qui permet de travailler avec 0<psi<360 
alpha1.f=0  ; angles qui nous renseignent  sur les parties éclairées et sombres de la lune 
alpha2.f=0 
alpha3.f=0 
alpha4.f=0 
Angle.f = 0.0 
IncAngle.f = 0.5
trace=0
#Pi=3.1415927 

; Enumeration des constantes pour les sprites (ça evite de s'embrouiller avec les nombres) 
Enumeration 
  #SPR_Background
  #spr_calque
  #spr_calquenoir
  #SPR_Terre 
  #SPR_OmbreTerre 
  #SPR_Lune 
  #SPR_LuneMini 
  #SPR_OmbreLune 
  #SPR_Soleil 
  #SPR_RayonsSoleil 
EndEnumeration 

;*************initialisation********************** 
InitSprite() 
InitKeyboard() 
InitSprite3D () 

OpenWindow (1, 1,1, 1000, 840,#PB_Window_ScreenCentered+ #PB_Window_SystemMenu , "Les phases de la Lune" ) ; on ouvre une fenetre 
  OpenWindowedScreen ( WindowID (1) , 0, 0, 600, 500, 1, 1, 1) ; on met un ecran dedans !! 
  UsePNGImageDecoder() 
  
  LoadFont(1, "Lucida Console", 8, #PB_Font_HighQuality | #PB_Font_Bold) 

LoadSprite(#SPR_Background, "Background.png") 

;***********************sprite terre*************************************** 

LoadSprite(#SPR_Terre, "Terre.png", #PB_Sprite_Texture) 
  CreateSprite3D(#SPR_Terre, #SPR_Terre) 

; Creation de 2 sprite temporaire pour faire le sprite d'ombrage de la terre 
TempSpr1 = CreateSprite (#PB_Any,32,32) ;terre éclairée sprite 32*32 
  StartDrawing ( SpriteOutput (TempSpr1)) 
    Circle (16,16, 16, RGB(196, 196, 196)) 
  StopDrawing () 

TempSpr2 = CreateSprite (#PB_Any,32,32) ; terre non éclairée sprite 32*32 
  StartDrawing ( SpriteOutput (TempSpr2)) 
    Circle (16,16, 16, RGB(12,12, 12)) 
  StopDrawing () 

ClipSprite(TempSpr1,0,0,16,32);découpage terre éclairée 
ClipSprite(TempSpr2,16,0,16,32); découpage terre non éclairée 

DisplaySprite(TempSpr1,100,100);affichage des deux sprites 
DisplaySprite(TempSpr2,116,100) 
  
GrabSprite(#SPR_OmbreTerre,100,100,32,32,#PB_Sprite_Texture) ;capture d'écran et création du sprite(3) terre 
                                               ; moitié éclairée moitié sombre 
CreateSprite3D(#SPR_OmbreTerre,#SPR_OmbreTerre) 
  
FreeSprite(TempSpr1) 
FreeSprite(TempSpr2) 

;******************************sprite lune************************************** 

LoadSprite(#SPR_Lune, "Lune.png", #PB_Sprite_Texture) 
  CreateSprite3D(#SPR_Lune, #SPR_Lune) 
LoadSprite(#SPR_LuneMini, "Lune_mini.png", #PB_Sprite_Texture) 
  CreateSprite3D(#SPR_LuneMini, #SPR_LuneMini) 

; Creation de 2 sprite temporaire pour faire le sprite d'ombrage de la lune 
TempSpr1 = CreateSprite (#PB_Any,16,16) ;lune éclairée sprite 16*16 
  StartDrawing ( SpriteOutput (TempSpr1)) 
    Circle (8,8,8, RGB(235, 235, 235)) 
  StopDrawing () 

TempSpr2 = CreateSprite (#PB_Any,16,16) ; lune non éclairée sprite 16*16 
  StartDrawing ( SpriteOutput (TempSpr2)) 
    Circle (8,8, 8, RGB(115, 115, 115)) 
  StopDrawing () 

ClipSprite(TempSpr1,0,0,8,16);découpage lune éclairée 
ClipSprite(TempSpr2,8,0,8,16); découpage lune non éclairée 

DisplaySprite(TempSpr1,100,132);affichage des deux sprites 
DisplaySprite(TempSpr2,108,132) 
  
GrabSprite(#SPR_OmbreLune,100,132,16,16,#PB_Sprite_Texture) ;capture d'écran et création du sprite(6) lune 
CreateSprite3D(#SPR_OmbreLune,#SPR_OmbreLune) 

FreeSprite(TempSpr1) 
FreeSprite(TempSpr2) 

;*********************************** sprite soleil****************************** 

LoadSprite(#SPR_Soleil, "Soleil.png", #PB_Sprite_Texture) 
  CreateSprite3D(#SPR_Soleil, #SPR_Soleil) 
  LoadSprite(#SPR_RayonsSoleil, "RayonsSoleil.png", #PB_Sprite_Texture) 
  CreateSprite3D(#SPR_RayonsSoleil, #SPR_RayonsSoleil) 
  ;************************************calque**************************************
 
  CreateSprite(#spr_calque,600,500)
  ;************************************calquenoir**************************************
  
  CreateSprite(#spr_calquenoir,600,500)
    
;***************************programme principal**************************************** 


Repeat ; boucle principale 
  
   Repeat 
     Event = WindowEvent() 
      
     Select Event 
       Case #PB_Event_CloseWindow 
         End 
     EndSelect 
   Until Event = #Null 
    
   If ExamineKeyboard() 
      If KeyboardPushed(#PB_Key_Escape) 
         End 
      EndIf 
      If KeyboardReleased(#PB_Key_F1) 
         Pause=1-Pause 
      EndIf 
      If KeyboardReleased(#PB_Key_F2) 
         Pause=1 
         Angle=ValF(InputRequester("Titre","Donnez l'angle en degré :",StrF(Angle))) 
      EndIf 
      If KeyboardReleased(#PB_Key_F3) 
        IncAngle=ValF(InputRequester("Titre","Donnez le pas d'incrementation de l'angle :",StrF(IncAngle))) 
      EndIf
      If KeyboardReleased(#PB_Key_F4) 
       trace=trace+1
       If trace>1
        trace=0
        EndIf
        
      EndIf 
   EndIf 
    
   ; ***********calcul des trajectoires************* 
    
   If Pause=0 
      Angle + IncAngle 
    
      If Angle>=360 
        Angle=0 
      EndIf 
   EndIf 
    
   theta=#Pi*Angle/180 ;conversions en radians 
   phi=#Pi*Angle/15 -Int(Angle/30)*2*#Pi  ; calcul pour garder  0<phi<360 
    
    
   xt=xs+rt*Cos(-theta); coords de la terre 
   yt=ys+rt*Sin(-theta) 
    
   xl=xt+rl*Cos(-phi); coords de la lune 
   yl=yt+rl*Sin(-phi) 
    
   If (xl-xs)>0     ; calcul de psi, l'angle Lune/Soleil 
      psi=180*ATan((yl-ys)/(xl-xs))/#Pi ; psi directement en degrés! 
   EndIf 
    
   If (xl-xs)<0 
      psi=180*(ATan((yl-ys)/(xl-xs))/#Pi-1); psi en degrés 
   EndIf 
    
    
   ;****************affichage des sprites*************************** 
   DisplaySprite(#SPR_Background, 0, 0) ; Pas de besoin de ClearScreen car le sprite recouvre tout l'écran 
    
   ;travail avec des angles positifs 
   If psi<=0 
      psi1=-psi 
   EndIf 
   If psi>0 
      psi1=360-psi 
   EndIf 
    
      alpha1=180+psi1-phi*180/#Pi  ; alpha=psi-phi modulo 180 
      alpha2=-180+psi1-phi*180/#Pi  ; à cause de ça je teste tous les cas 
      alpha3= psi1-phi*180/#Pi 
      alpha4= 360+psi1-phi*180/#Pi 
  
   StartDrawing(ScreenOutput()) 
      
     DrawingFont(FontID()) 
     FrontColor(255,255,255) 
      
     DrawingMode(1) 
     Locate(5,440) 
     DrawText("F1 visualisation de la phase de la Lune | F2 choix de l'angle Terre/Soleil") 
     Locate(5,460) 
    DrawText ("F3 choix du pas d'incrémentation de l'angle |F4 trajectoires | Esc quitter") 
     Locate(xt+20,yt+20) 
     DrawText(StrF(theta*180/#Pi,2)) 
     Locate(xl+12,yl+12) 
     DrawText(StrF(phi*180/#Pi,2))    
      
     If Pause = 1 
       LineXY(xt,yt,xl,yl,RGB(255, 255, 255)); ligne qui relie la Terre  à la Lune pour préciser où se 
       ;trouve l'observateur 
     EndIf 
      
     ;en fonction de l'alpha choisi, la manière de dessiner change 
      
     ;********alpha1*****************    
     If alpha1>=0 And alpha1<=180 
      
       Locate(10,5) 
       DrawText("Partie éclairée de la Lune = "+StrF(alpha1*100/180,2)+" %") 
        
       If Cos(alpha1*#Pi/180)<0 And Sin(alpha1*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Box(568,0,32,64,RGB(0, 0, 0)) 
         Ellipse(568,32,32*Cos(alpha1*#Pi/180),32,RGB(128, 128, 128)) 
       EndIf 
        
       If Cos(alpha1*#Pi/180)>0 And Sin(alpha1*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Ellipse(568,32,32*Cos(alpha1*#Pi/180),32,RGB(0,0,0)) 
         Box(568,0,32,64,RGB(0, 0, 0)) 
       EndIf 
        
     EndIf 
     ;*******alpha2****************** 
     If alpha2>0 And alpha2<180 
      
       Locate(10,5) 
       DrawText("Partie éclairée de la Lune = "+StrF(alpha2*100/180,2)+"%") 
        
       If Cos(alpha2*#Pi/180)<0 And Sin(alpha2*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Box(568,0,32,64,RGB(0, 0, 0)) 
         Ellipse(568,32,32*Cos(alpha2*#Pi/180),32,RGB(128, 128, 128)) 
       EndIf 
        
       If Cos(alpha2*#Pi/180)>0 And Sin(alpha2*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Ellipse(568,32,32*Cos(alpha2*#Pi/180),32,RGB(0,0,0)) 
         Box(568,0,32,64,RGB(0, 0, 0)) 
       EndIf 
      
     EndIf 
     ;*********************alpha3************ 
      
     If alpha3>0 And alpha3<180 
       Locate(10,5) 
       DrawText("Partie éclairée de la Lune = "+StrF(100-alpha3*100/180,2)+"%") 
        
       If Cos(alpha3*#Pi/180)<0 And Sin(alpha3*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Ellipse(568,32,32*Cos(alpha3*#Pi/180),32,RGB(0,0,0)) 
         Box(536,0,32,64,RGB(0, 0, 0)) 
       EndIf 
        
        
       If Cos(alpha3*#Pi/180)>0 And Sin(alpha3*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Box(536,0,32,64,RGB(0, 0, 0)) 
         Ellipse(568,32,32*Cos(alpha3*#Pi/180),32,RGB(128, 128, 128)) 
       EndIf 
     EndIf 
     ;**************************alpha4**********    
     If alpha4>0 And alpha4<180 
       Locate(10,5) 
       DrawText("Partie éclairée de la Lune = "+StrF(100-alpha4*100/180,2)+"%") 
        
       If Cos(alpha4*#Pi/180)<0 And Sin(alpha4*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Ellipse(568,32,32*Cos(alpha4*#Pi/180),32,RGB(0,0,0)) 
         Box(536,0,32,64,RGB(0, 0, 0)) 
       EndIf 
        
        
       If Cos(alpha4*#Pi/180)>0 And Sin(alpha4*#Pi/180)>0 
         Circle(568,32,32,RGB(128, 128, 128)) 
         Box(536,0,32,64,RGB(0, 0, 0)) 
         Ellipse(568,32,32*Cos(alpha4*#Pi/180),32,RGB(128, 128, 128)) 
       EndIf 
     EndIf 
     ;*********************************************************      
    
     LineXY(535,0,600,0)  ; cadre pour la Lune en haut à droite 
     LineXY(535,0,535,64)    
     LineXY(600,0,600,64) 
     LineXY(535,64,600,64) 
   StopDrawing() 
    
   Start3D(); utilisation des effets de la 3D pour la rotation des sprites 
 
      RotateSprite3D(#SPR_Terre,-theta*180/#Pi,0); rotation de la terre avec l'angle en degrés 
      RotateSprite3D(#SPR_OmbreTerre,-theta*180/#Pi,0) 
      RotateSprite3D(#SPR_LuneMini,psi,0)       ; rotation de la Lune 
      RotateSprite3D(#SPR_OmbreLune,psi,0)      
      Sprite3DBlendingMode(5, 7) ; change le BlendingMode pour un meilleur effet 
      DisplaySprite3D(#SPR_RayonsSoleil,xs-48,ys-48, 255) ; affichage rayons soleil 
      DisplaySprite3D(#SPR_Soleil,xs-48,ys-48, 255)         ; affichage soleil 
      Sprite3DBlendingMode(5, 6) 
      DisplaySprite3D(#SPR_Terre,xt-16,yt-16, 255)      ; affichage terre 
      DisplaySprite3D(#SPR_OmbreTerre, xt-16,yt-16,128) 
      DisplaySprite3D(#SPR_LuneMini,xl-8,yl-8, 255)      ; affichage lune 
      DisplaySprite3D(#SPR_OmbreLune, xl-8,yl-8, 128) 
      DisplaySprite3D(#SPR_Lune, 536, 1, 128) ; ombrage lune (haut droit) 
      

      Stop3D() 
      
        
    ;*******************visualisation de la trajectoire*****************   
      StartDrawing(SpriteOutput(#spr_calque))
      Plot(xl,yl,RGB($80,$0,$FF))
        Plot(xt,yt,RGB($0,$FF,$FF))
        StopDrawing()
      
        If trace=1          
          DisplayTransparentSprite(#spr_calque,0,0)
        Else
          CopySprite(#spr_calquenoir,#spr_calque)
        EndIf
;************************************************

   FlipBuffers () ; 
    
   Delay(60) 
    
ForEver 

Hasta la vista!

Si on m'avait dit j'y aurais pas cru!!! Vive PureBasic!!!


Question: est-ce possible d'enlever le carré noir autour de la terre???(si on fonce le décor y a pas de problèmes (pani pwoblem quoi!)

Elevé au MSX !
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Bonsoir.

Suite à mon post dans dans retrogradation Mars, je poste la réponse dans ce topic où il a plus ça place. Comme je l'expliquais dans mon autre post, mon désir serai d'afficher les phases de la lune en temps reel et suivant la position de l'observateur. Je ne veux pas afficher les librations de celle-ci ce qui compliquerai encore plus le programme.
Voici un exemple de ce que je fais et qui marche mais la phase n'est pas calculée en temps reel mais seulement pour des cas bien déterminés.
voici mon code:

Code : Tout sélectionner

;/ Created with PureVisionXP v2.13
;/ Fri, 14 Oct 2005 10:46:36
;/ by Andre Goudonnet

DefType.w KE,K,H,AA,MO,SOL
DefType.b Hplus
Global Phase,Lunaison,Rayon,CXorig,CYorig,annee,mois,jour
Global KE,K,H,AA,MO,SOL
Global U.f,M.f,E.f,l.f,LD.f,V.f,P.f,L0.f,LP.f,P0.f,PP.f,XS.f,YS.f,LL.f,MS.f,b.f,PH.f,RD.f,LS.f,AR.f,AH.f,DE.f,EP.f,N.f,TS.f,HS.f,HZ.f,HL.f,LA.f,LO.f,HE.f,MI.f,J.f,ZX.f
Global Date$,Image0,Image1,Hplus

InitSprite()
InitSprite3D()
InitKeyboard()

Date$ = FormatDate("%dd.%mm", Date())
Time$ = FormatDate("%hh:%ii:%ss", Date())
resultat=LoadFont(1,"Arial",10)
resultat=LoadFont(2,"Arial",32)
resultat=LoadFont(3,"Arial",7)
resultat=LoadFont(4,"Arial",20)

Enumeration
  #Window
  #NL
  #ENLPQ
  #PQ
  #EPQPL
  #PL
  #EPLDQ
  #DQ
  #EDQNL
  #Station
  #Sprite_0
  #Sprite_1
  #Sprite_2
  #Image_3
  #Image_4
  #Image_5
  #Image_6
  #Image_7
  #Image_8
EndEnumeration

#PI=3.1415926
Hplus=1

CreateImage(#NL,72,72);image de la nouvelle lune
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(1)
Circle(36,36,36,RGB(0,0,0))
StopDrawing()

CreateImage(#ENLPQ,72,72);image de la lune entre nouvelle lune et premier quartier
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(4)
Circle(36,36,36,RGB(0,0,0))
Angle.f=4.70
Repeat
  x.f=36+18*Cos(Angle) 
  y.f=36+36*Sin(Angle)
  Plot(x,y,RGB(0,0,0))
  Angle=Angle+0.001
Until Angle=>8.08
FillArea(70,36,RGB(0,0,0),RGB(255,255,255))
FillArea(36,36,RGB(0,0,0),RGB(1,0,0))
StopDrawing()

CreateImage(#PQ,72,72);image de la lune au premier quartier
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(4)
Circle(36,36,36,RGB(0,0,0))
LineXY(36,0,36,72,RGB(0,0,0))
FillArea(70,36,RGB(0,0,0),RGB(255,255,255))
FillArea(30,36,RGB(0,0,0),RGB(1,0,0))
StopDrawing()

CreateImage(#EPQPL,72,72);image de la lune entre premier quartier et pleine lune
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(4)
Circle(36,36,36,RGB(0,0,0))
Angle.f=1.80
Repeat
  x=36+18*Cos(Angle) 
  y=36+36*Sin(Angle)
  Plot(x,y,RGB(0,0,0))
  Angle=Angle+0.001
Until Angle=>4.71
FillArea(10,36,RGB(0,0,0),RGB(1,0,0))
FillArea(46,36,RGB(0,0,0),RGB(255,255,255))
StopDrawing()

CreateImage(#PL,72,72); image de la pleine lune
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(1)
Circle(36,36,36,RGB(255,255,255))
StopDrawing()

CreateImage(#EPLDQ,72,72);image de la lune entre pleine lune et dernier quartier
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(4)
Circle(36,36,36,RGB(0,0,0))
Angle=4.70
Repeat
  x=36+18*Cos(Angle) 
  y=36+36*Sin(Angle)
  Plot(x,y,RGB(0,0,0))
  Angle=Angle+0.001
Until Angle=>8.08
FillArea(70,36,RGB(0,0,0),RGB(1,0,0))
FillArea(36,36,RGB(0,0,0),RGB(255,255,255))
StopDrawing()

CreateImage(#DQ,72,72);Dernier quartier
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(4)
Circle(36,36,36,RGB(0,0,0))
LineXY(36,0,36,72,RGB(0,0,0))
FillArea(70,36,RGB(0,0,0),RGB(1,0,0))
FillArea(30,36,RGB(0,0,0),RGB(255,255,255))
StopDrawing()

CreateImage(#EDQNL,72,72); entre dernier quartier et nouvelle lune
StartDrawing(ImageOutput())
Box(0,0,72,72,RGB(186,214,177))
DrawingMode(4)
Circle(36,36,36,RGB(0,0,0))
Angle=1.80
Repeat
  x=36+18*Cos(Angle) 
  y=36+36*Sin(Angle)
  Plot(x,y,RGB(0,0,0))
  Angle=Angle+0.001
Until Angle=>4.71
FillArea(10,36,RGB(0,0,0),RGB(255,255,255))
FillArea(46,36,RGB(0,0,0),RGB(1,0,0))
StopDrawing()


Procedure.s GetDateVal()  
  GetLocalTime_(@s.SYSTEMTIME)
  mois =s\wMonth
  jour =s\wDay
  annee=s\wYear
EndProcedure


Procedure Affichage_texte(Xtext,Ytext,Texte.s,Font.b)
  DrawingMode(1)
  DrawingFont(UseFont(Font))
  Locate(Xtext,Ytext)
  DrawText(Texte)
EndProcedure
                    
Procedure Julien()
  J=jour
  MO=mois
  AA=annee
  HE =Hour(Date())
  MI =Minute(Date())
  HS.f=(HE+MI/60)/24
  LA.f=44.08;..............Latitude de la ville d'Orange
  LA=LA*#PI/180
  LO.f=-4.47;...............Longitude de la ville d'Orange
  J.f=J+HS
  N=(AA*365+31*(MO-1))+J
  If MO>2
    Goto suite
  EndIf
  AA=AA-1
  suite:
  N=N+AA/4-AA/100+AA/400
  If MO<=2
    Goto suivant
  EndIf
  N.f=N-Int((MO-1)*0.4+2.7)
  suivant:
  N=N-694325
EndProcedure

Procedure Recentrage()
  RD.f=(RD.f/2/#PI-Int(RD.f/2/#PI))*2*#PI
  If RD<0
    RD=RD+2*#PI
  EndIf
EndProcedure

Procedure Kepler()
  U.f=M.f
  For K=1 To KE
    U=M+E*Sin(U)
  Next K
EndProcedure

Procedure Radian_Degre()
  LD.f=l.f*180/#PI
  LD.f=(LD.f/360-Int(LD.f/360))*360
  If LD.f<0
    LD.f=LD.f+360
  EndIf
  LD.f=(LD.f*10+0.5)/10
EndProcedure

Procedure Calcul_H_M_S()
  H=Int(RD/#PI*12)
  M=Int((RD-H*#PI/12)*720/#PI)
  s=Int((RD-H*#PI/12-M*#PI/720)*43200/#PI)
EndProcedure

Procedure Declinaison()
  EP.f=0.40927971
  SD.f=Cos(EP)*Sin(b.f)+Sin(EP)*Cos(b.f)*Sin(l.f)
  DE.f=ATan(SD/Sqr(1-SD*SD))
  SR.f=-Sin(EP)*Sin(b)+Cos(EP)*Cos(b)*Sin(l)
  RD.f=ATan(SR/Cos(b)/Cos(l))
  If Cos(b)*Cos(l)<0
    RD=RD+#PI
  EndIf
  If RD<0
    RD=RD+2*#PI
  EndIf
  AR.f=RD
  Recentrage()
  Calcul_H_M_S()
EndProcedure

Procedure Temps_Sideral()
  RD.f=1.7273+0.01720279*N.f+HS.f*2*#PI-LO.f*#PI/180
  Recentrage()
  TS.f=RD.f
EndProcedure

Procedure Lever_Coucher()
  HC.f=(Cos(ZX.f)-Sin(LA.f)*Sin(DE.f))/Cos(LA.f)/Cos(DE.f)
  HL.f=-ATan(HC/Sqr(-HC*HC+1))+#PI/2
  HZ.f=2*#PI*HS-AH.f
  RD=HZ-HL
  Recentrage()
  Calcul_H_M_S()
  M$=""
  H$=""
  M$=LTrim(Str(M))
  If Len(M$)=1
    M$="0"+M$
    H$=Str(H+Hplus)+":"+M$
  Else
    H$=Str(H+Hplus)+":"+Str(M)
  EndIf
  If SOL=1
    Affichage_texte(12,80,H$,4)
  Else
    Affichage_texte(362,80,H$,4)
  EndIf
  RD=HZ+HL
  Recentrage()
  Calcul_H_M_S()
  M$=""
  H$=""
  M$=LTrim(Str(M))
  If Len(M$)=1
    M$="0"+M$
    H$=Str(H+Hplus)+":"+M$
  Else
    H$=Str(H+Hplus)+":"+Str(M)
  EndIf
  If SOL=1
    Affichage_texte(12,165,H$,4)
  Else
    Affichage_texte(362,165,H$,4)
  EndIf
EndProcedure

Procedure Calcul_Phase()
  PH.f=l.f-LS.f; d'après ce que j'ai compris, l'angle de phase est egal a la position de la lune moins celle du soleil.
  RD.f=PH.f
  Recentrage()
  PH.f=RD.f
  If PH<#PI/24
    Affichage_texte(220,80,"NOUVELLE LUNE",3)
    DrawImage(UseImage(#NL),215,95)
    ProcedureReturn
  EndIf
  If PH<11*#PI/24
    Affichage_texte(220,80,"ENTRE NL & PQ",3)
    DrawImage(UseImage(#ENLPQ),215,95)
    ProcedureReturn
  EndIf
  If PH<13*#PI/24
    Affichage_texte(220,80,"PREMIER QUARTIER",3)
    DrawImage(UseImage(#PQ),215,95)
    ProcedureReturn
  EndIf
  If PH<23*#PI/24
    Affichage_texte(220,80,"ENTRE PQ & PL",3)
    DrawImage(UseImage(#EPQPL),215,95)
    ProcedureReturn
  EndIf
  If PH<25*#PI/24
    Affichage_texte(220,80,"PLEINE LUNE",3)
    DrawImage(UseImage(#PL),215,95)
    ProcedureReturn
  EndIf
  If PH<35*#PI/24
    Affichage_texte(220,80,"ENTRE PL & DQ",3)
    DrawImage(UseImage(#EPLDQ),215,95)
    ProcedureReturn
  EndIf
  If PH<37*#PI/24
    Affichage_texte(220,80,"DERNIER QUARTIER",3)
    DrawImage(UseImage(#DQ),215,95)
    ProcedureReturn
  EndIf
  If PH<47*#PI/24
    Affichage_texte(220,80,"ENTRE DQ & NL",3)
    DrawImage(UseImage(#EDQNL),215,95)
  EndIf
EndProcedure

Procedure Soleil()
  L0.f=4.8689
  LP.f=0.01720279
  P0.f=4.9085
  PP.f=0.00000081
  E.f=0.01675104
  A.f=1.00000023
  KE=3
  P.f=P0+PP*N
  LL.f=L0+LP*N
  M.f=LL-P
  MS.f=M
  Kepler()
  V.f=2*ATan(Tan(U/2)*Sqr((1+E)/(1-E)))
  R.f=A*(1-E*Cos(U))
  l.f=V+P
  LS.f=l
  XS=R*Cos(l)
  YS=R*Sin(l)
  Radian_Degre()
  Declinaison()
  Temps_Sideral()
  AH.f=TS.f-AR.f
  ZX.f=90.85*#PI/180
  SOL=1
  Lever_Coucher()
EndProcedure

Procedure Lune()
  l.f=0.57999+0.22997150*N
  O.f=4.1867-0.00092422*N
  M.f=0.3193+0.22802713*N
  D.f=l.f-LL.f
  f.f=l-O
  l=l+0.1098*Sin(M.f)+0.003728*Sin(2*M.f)+0.01149*Sin(2*D.f)
  l=l-0.003329*Sin(MS.f)+0.02224*Sin(2*D.f-M.f)-0.001945*Sin(2*f.f)
  l=l+0.001026*Sin(2*D.f-2*M.f)+0.0009983*Sin(2*D.f-M.f-MS.f)
  l=l+0.0009903*Sin(2*D.f+M.f)+0.0008011*Sin(2*D.f-MS.f)
  l=l+0.0007156*Sin(M.f-MS.f)-0.0005323*Sin(M.f+MS.f)-0.0006074*Sin(D.f)
  b.f=0.08995*Sin(f.f)+0.0049*Sin(M.f+f.f)+0.00485*Sin(M.f-f.f)+0.003*Sin(2*D.f-f.f)
  b.f=b+0.00097*Sin(2*D.f-M.f+f.f)+0.0008*Sin(2*D.f-M.f-f.f)+0.00057*Sin(2*D.f+f.f)
  Radian_Degre()
  Declinaison()
  AH.f=TS.f-AR.f
  Calcul_Phase()
  SOL=0
  ZX.f=90.58*#PI/180
  Lever_Coucher()
EndProcedure

Procedure DessinStation()
GetDateVal()
StartDrawing(ScreenOutput())
Box(0,0,500,210,RGB(186,214,177))
LineXY(0,60,500,60)
Affichage_texte(90,15,FormatDate("%hh:%ii", Date() ),2)
Affichage_texte(10,10,"HEURE",1)
Affichage_texte(10,25,"DCF",1)
Affichage_texte(330,5,"DATE",1)
Affichage_texte(330,15,Date$,2)
Affichage_texte(10,65,"LEVER SOLEIL",3)
Affichage_texte(360,65,"LEVER LUNE",3)
Affichage_texte(10,150,"COUCHER SOLEIL",3)
Affichage_texte(360,150,"COUCHER LUNE",3)
Affichage_texte(220,65,"PHASE LUNE",3)
Affichage_texte(215,170,"VILLE",1)
Affichage_texte(215,190,"ORANGE",1)
Julien()
Soleil()
Lune()
If Hplus=2
  Affichage_texte(10,40,"Heure d'été",1)
ElseIf Hplus=1
  Affichage_texte(10,40,"Heure d'hiver",1)
EndIf
StopDrawing()
EndProcedure


If OpenWindow(#Window, 0, 0, 500, 210, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "PhaseLune") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf
OpenWindowedScreen(WindowID(),0,0,500,210,0,0,0)
   ClearScreen(255,255,255)
   DessinStation()
Repeat
  Event = WaitWindowEvent()  
Until Event = #PB_EventCloseWindow
End
Vous excuserez le peu de commentaires du programme, mais je pense que c'est suffisant pour donner une idée. :(
Voilà j'espère que quelqu'un pourra apporter une solution à mon problème.
Merci d'avance pour vos réponses.
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Wahou!

Message par Huitbit »

Tu as utilisé l'artillerie lourde!


Tu as peut-être remarqué que pour dessiner les phases, j'utilisais des ellipses.

A propos de l'angle de phase de la Lune, d'après ce que je sais, si tu imagine un triangle, "Terre, Lune, Soleil" et bien l'angle de phase de la Lune c'est l'angle au sommet "Lune"
Ce qui est très interessant !!!

Moi dans mon prog j'ai juste bidouillé à partir de dessins pour trouver des angles(j'aime bien partir d'une observation et "découvrir" des choses(déjà découvertes!!!), ici apparemment tu les calcules, il y a donc un espoir.

Je vais voir si ton angle de phase à un lien avec la partie éclairée de la Lune, si c'est le cas, ça devrait être jouable!!(mais avant il faut que je fasse mes devoirs!!!!sniff :( snifff))

Super ton prog! Pour les procédures de calcul, tu les as récupérées où?

A+
Elevé au MSX !
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Message par Good07 »

Bonsoir.

Voilà, je rentre du boulot comme la chanson des septs nains. :D

Je suis obligé de passer par ses formules c'est les seules que je connaisse pour résoudre ce problème.
Elles viennent toutes d'un livre qui s'appelle " Calcul astronomique pour amateurs" Auteur Serge Bouiges éditions Masson 1982.
Je sais ça date, mais je n'ai jamais trouvé mieux car à l'époque on ne parlait que du basic.
J'en ai un autre qui s'intitule "Astronomie pratique et informatique" par C. Dumoulin et J.P Parisot Editions Masson 1987. Plus réçant, mais bourré d'erreurs et en plus les programmes sont souvent fait sur des calculettes et alors là bonjour les traductions... :(
Voici un autre programme plus simple qui pourra peut-être t'aider:

Code : Tout sélectionner

;explication des variables utilisées

;l=longitude du soleil
;M=anomalie moyenne du soleil
;LS=longitude écliptique du soleil
;ll=longitude écliptique de la lune
;b=latitude écliptique de la lune
;D=élongation
;I=Angle de phase
;F=Phase

;-----------------------------------------

#PI=3.14159265
JJ=16
MM=7
AA=1986
Y=AA
If MM<3
  MM=MM+12
  Y=AA-1
EndIf
JD.f=Int(365.25*Y)+Int(30.6001*(MM+1))+JJ+1720994.5+2-Int(Y/100)+Int(Int(Y/100)/4)
T.f=(JD-2415020)/36525
l.f=279.69+36000.76*T
l=(l*#PI)/180
M.f=358.47+35999.05*T
M=(M*#PI)/180
LS.f=l+0.0334928*Sin(M)
P.f=((270.43+481267.88*T)*#PI)/180
MP.f=((296.10+477198.85*T)*#PI)/180
D.f=((350.74+445267.11*T)*#PI)/180
f.f=((11.25+483202.02*T)*#PI)/180
LL.f=P+0.1097812*Sin(MP)+0.0222354*Sin(2*D-MP)+0.01151917*Sin(2*D)+0.00366519*Sin(2*MP)-0.00331612*Sin(M)-0.00191986*Sin(2*f)
b.f=0.0895004*Sin(f)+0.00488692*Sin(MP+f)+0.00488692*Sin(MP-f)+0.00314159*Sin(2*D-f)
D.f=ACos(Cos(LL-LS)*Cos(b))
I.f=#PI-D-0.00261799*Sin(D)
F.f=0.00872664*(1+Cos(I))
AGE.f=(#PI-I)*29.53/6.28
Debug"Pour le "+Str(jj)+" "+Str(MM)+" "+Str(AA)
Debug "Phase = "+StrF((F*180)/#PI)
Debug "Age de la lune= "+StrF(AGE,2)+" "+"Jours"


Bon courage pour les devoirs. :wink:

Ah ! PureBasic quand tu nous tiens... :D

A+

André.
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

un début de solution

Message par Good07 »

Bon, en regardant de plus près le programme au dessus, je me suis dit que l'on pouvais peut-être en tirer quelque chose.
En fait ça marche, j'ai mélangé les deux programmes, celui des phases et le mien et ça marche à moitié. :(
Jusqu'a la pleine lune, c'est à dire le 14 janvier, pas de problème. Mais après, il faut inverser le sens de l'ombre qui doit être à droite et non plus à gauche. De plus, le programme donne toujours l'âge de la lune avec un maximum de 14 jours. Après, ça décroit de nouveau jusqu'à 0. Pour moi, l'âge doit aller de 0 à 28 jours.
Voilà, j'essaye de trouver une solution mais pour l'instant... :(

voici le programme modifié:

Code : Tout sélectionner

;explication des variables utilisées

;l=longitude du soleil
;M=anomalie moyenne du soleil
;LS=longitude écliptique du soleil
;ll=longitude écliptique de la lune
;b=latitude écliptique de la lune
;D=élongation
;I=Angle de phase
;F=Phase

;-----------------------------------------

Enumeration
  #SPR_Terre
  #SPR_OmbreTerre
  #SPR_Lune
  #SPR_OmbreLune
EndEnumeration

;*************initialisation**********************
InitSprite()
InitKeyboard()
InitSprite3D ()

#PI=3.14159265
JJ=10
MM=1
Mois=MM
AA=2006
Y=AA
If MM<3
  MM=MM+12
  Y=AA-1
EndIf
JD.f=Int(365.25*Y)+Int(30.6001*(MM+1))+JJ+1720994.5+2-Int(Y/100)+Int(Int(Y/100)/4)
T.f=(JD-2415020)/36525
l.f=279.69+36000.76*T
l=(l*#PI)/180
M.f=358.47+35999.05*T
M=(M*#PI)/180
LS.f=l+0.0334928*Sin(M)
P.f=((270.43+481267.88*T)*#PI)/180
MP.f=((296.10+477198.85*T)*#PI)/180
D.f=((350.74+445267.11*T)*#PI)/180
f.f=((11.25+483202.02*T)*#PI)/180
LL.f=P+0.1097812*Sin(MP)+0.0222354*Sin(2*D-MP)+0.01151917*Sin(2*D)+0.00366519*Sin(2*MP)-0.00331612*Sin(M)-0.00191986*Sin(2*f)
b.f=0.0895004*Sin(f)+0.00488692*Sin(MP+f)+0.00488692*Sin(MP-f)+0.00314159*Sin(2*D-f)
D.f=ACos(Cos(LL-LS)*Cos(b))
I.f=#PI-D-0.00261799*Sin(D)
F.f=0.00872664*(1+Cos(I))
AGE.f=(#PI-I)*29.53/6.28
F=F*180/#PI
alpha= I*180/#Pi

OpenWindow (0, 0,0, 300, 300,#PB_Window_ScreenCentered+ #PB_Window_SystemMenu , "Les phases de la Lune" ) ; on ouvre une fenetre
  OpenWindowedScreen ( WindowID() , 0, 0, 300, 300, 1, 1, 1) ; on met un ecran dedans !!
  UsePNGImageDecoder()
 


;******************************sprite lune**************************************

 LoadSprite(#SPR_Lune, "Lune.png", #PB_Sprite_Texture)
 CreateSprite3D(#SPR_Lune, #SPR_Lune)
 GrabSprite(#SPR_OmbreLune,100,132,16,16,#PB_Sprite_Texture) ;capture d'écran et création du sprite(6) lune
 CreateSprite3D(#SPR_OmbreLune,#SPR_OmbreLune)

   
;***************************programme principal****************************************


Repeat ; boucle principale
 
   Repeat
     Event = WindowEvent()
     
     Select Event
       Case #PB_Event_CloseWindow
         End
     EndSelect
   Until Event = #Null
   
   If ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Escape)
         End
      EndIf
   EndIf
   


      StartDrawing(ScreenOutput())
      DrawingMode(1)
      FrontColor(255,255,255)
      Locate(10,10)
      DrawText("Pour le "+Str(jj)+" "+Str(Mois)+" "+Str(AA))
      Locate(10,30)
      DrawText("Age de la lune= "+StrF(AGE,2)+" "+"Jours")

     
     
     If alpha>0 And alpha<180
       Locate(10,50)
       DrawText("Partie éclairée de la Lune = "+StrF(F*100,2)+"%")
       
       If Cos(alpha*#Pi/180)<0 And Sin(alpha*#Pi/180)>0
         Circle(100,132,32,RGB(128, 128, 128))
         Ellipse(100,132,32*Cos(alpha*#Pi/180),32,RGB(0,0,0))
         Box(68,100,32,64,RGB(0, 0, 0))
       EndIf
       
       
       If Cos(alpha*#Pi/180)>0 And Sin(alpha*#Pi/180)>0
         Circle(100,132,32,RGB(128, 128, 128))
         Box(68,100,32,64,RGB(0, 0, 0))
         Ellipse(100,132,32*Cos(alpha*#Pi/180),32,RGB(128, 128, 128))
       EndIf
     EndIf


   StopDrawing()
   
   Start3D(); utilisation des effets de la 3D pour la rotation des sprites
 
       Sprite3DBlendingMode(5, 7) ; change le BlendingMode pour un meilleur effet
       DisplaySprite3D(#SPR_Lune, 68, 100, 128) ; ombrage lune (haut droit)
     

   Stop3D()
     

   FlipBuffers () ;
   
   Delay(60)
   
ForEver
A+

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

C'est normal!

Message par Huitbit »

Je n'ai pas eu le temps de me pencher sur la question, mais les résultats que tu obtiens sont normaux!!

Dans mon programme, dans l'affichage des phases je n'utilise que des angles qui varient de 0 à 180°
En fait je vais du croissant blanc à la pleine lune blanche ...
puis du croissant noir à la pleine lune noire!

Continue, tu vas trouver!

Dès que je peux, je m'y mets aussi!

A+
Elevé au MSX !
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Illustration de mes propos!

Message par Huitbit »

J'ai pris un peu sur mon sommeil

J'ai rajouté un bouton pour faire défiler les jours et affiché les valeurs de alpha

Voilà le code:

Code : Tout sélectionner

;explication des variables utilisées 

;l=longitude du soleil 
;M=anomalie moyenne du soleil 
;LS=longitude écliptique du soleil 
;ll=longitude écliptique de la lune 
;b=latitude écliptique de la lune 
;D=élongation 
;I=Angle de phase 
;F=Phase 

;----------------------------------------- 

Enumeration 
  #SPR_Terre 
  #SPR_OmbreTerre 
  #SPR_Lune 
  #SPR_OmbreLune 
EndEnumeration 

;*************initialisation********************** 
InitSprite() 
InitKeyboard() 
InitSprite3D () 



OpenWindow (0, 0,0, 500, 300,#PB_Window_ScreenCentered|#PB_Window_SystemMenu , "Les phases de la Lune" ) ; on ouvre une fenetre 
OpenWindowedScreen ( WindowID() , 0, 0, 500, 280, 0, 1, 1) ; on met un ecran dedans !! 
CreateGadgetList(WindowID(0)) 
ButtonGadget(1,0,280,90,20,"jour=jour+1") 




    
;***************************programme principal**************************************** 
JJ=1
#PI=3.14159265 
ancien_alpha=167; variable qui mémorise le dernier angle alpha 
Repeat ; boucle principale 
  
  Repeat 
    Event = WindowEvent() 
    
    Select Event 
      Case #PB_Event_CloseWindow 
        End 
    
      Case #PB_EventGadget ; bouton pour faire varier les jours
    Select EventGadgetID() 
      Case 1 
        JJ=JJ+1
        ancien_alpha=k; transfert de alpha dans ancien_valeur
        
    EndSelect  
    EndSelect 
  Until Event = #Null 
  
  ClearScreen(0,0,0); pour éviter que les écritures se superposent
  
  
  MM=1
  Mois=MM 
  AA=2006 
  Y=AA 
  If MM<3 
    MM=MM+12 
    Y=AA-1 
  EndIf 
  JD.f=Int(365.25*Y)+Int(30.6001*(MM+1))+JJ+1720994.5+2-Int(Y/100)+Int(Int(Y/100)/4) 
  T.f=(JD-2415020)/36525 
  l.f=279.69+36000.76*T 
  l=(l*#PI)/180 
  M.f=358.47+35999.05*T 
  M=(M*#PI)/180 
  LS.f=l+0.0334928*Sin(M) 
  P.f=((270.43+481267.88*T)*#PI)/180 
  MP.f=((296.10+477198.85*T)*#PI)/180 
  D.f=((350.74+445267.11*T)*#PI)/180 
  f.f=((11.25+483202.02*T)*#PI)/180 
  LL.f=P+0.1097812*Sin(MP)+0.0222354*Sin(2*D-MP)+0.01151917*Sin(2*D)+0.00366519*Sin(2*MP)-0.00331612*Sin(M)-0.00191986*Sin(2*f) 
  b.f=0.0895004*Sin(f)+0.00488692*Sin(MP+f)+0.00488692*Sin(MP-f)+0.00314159*Sin(2*D-f) 
  D.f=ACos(Cos(LL-LS)*Cos(b)) 
  I.f=#PI-D-0.00261799*Sin(D) 
  f.f=0.00872664*(1+Cos(I)) 
  AGE.f=(#PI-I)*29.53/6.28 
  f=f*180/#PI 
  alpha= I*180/#PI  
  k=alpha; transfert de alpha (voir ancien_alpha)
  
  StartDrawing(ScreenOutput()) 
  DrawingMode(1) 
  FrontColor(255,255,255) 
  Locate(10,10) 
  DrawText("Pour le "+Str(JJ)+" "+Str(Mois)+" "+Str(AA)) 
  Locate(10,30) 
  DrawText("ancien_alpha= "+StrF(ancien_alpha)+"   AGE de la lune= "+StrF(AGE,2)+" "+"Jours") 
  Locate(10,50) 
  DrawText("alpha= "+StrF(alpha)) 
  ; alpha est une fonction soit croissante, soit décroissante, on en tient compte popur dessiner la lune
  If ancien_alpha>=alpha  
    If Cos(alpha*#PI/180)<0
    Circle(468,32,32,RGB(128, 128, 128)) ;disque plein
    Ellipse(468,32,32*Cos(alpha*#PI/180),32,RGB(0,0,0)) ;ellipse noire 
    Box(436,0,32,64,RGB(0, 0, 0)) ; on efface la parite gauche du dessin
  Else
    Circle(468,32,32,RGB(128, 128, 128)) ;disque plein
     Box(436,0,32,64,RGB(0, 0, 0)) ; on efface la parite gauche du disque
    Ellipse(468,32,32*Cos(alpha*#PI/180),32,RGB(128,128,128)) ;ellipse blanche
  EndIf
EndIf

If ancien_alpha<alpha  
  If Cos(alpha*#PI/180)>0
    Circle(468,32,32,RGB(128, 128, 128)) 
    Box(468,0,32,64,RGB(0, 0, 0)) ;on efface la partie droite
    Ellipse(468,32,32*Cos(alpha*#PI/180),32,RGB(128,128,128)) ;ellipse blanche
    
  Else
    Circle(468,32,32,RGB(128, 128, 128)) 
    Box(468,0,32,64,RGB(0, 0, 0)) ;on efface la partie de droite
    Ellipse(468,32,32*Cos(alpha*#PI/180),32,RGB(0,0,0)) ;ellipse noire
  EndIf
EndIf



  StopDrawing() 

  
  FlipBuffers () ;  
  
  
ForEver 

J'espère que ça te fera gagner du temps!

Bonne nuit!
Elevé au MSX !
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

Programme termineé !

Message par Good07 »

Bonjour Huitbit.

Merci pour ta contribution. C'est exactement ce que je voulai. :D

J'ai juste rajouté les sprites de Cédéravic, la gestion des jours en fonction du mois et le calcul de l'âge sur 29.53 jours au lieu de 14 jours ce qui est plus logique pour moi.

Voilà le programme terminé:

Code : Tout sélectionner

;explication des variables utilisées

;l=longitude du soleil
;M=anomalie moyenne du soleil
;LS=longitude écliptique du soleil
;ll=longitude écliptique de la lune
;b=latitude écliptique de la lune
;D=élongation
;I=Angle de phase
;F=Phase

;-----------------------------------------

Enumeration
  #SPR_Terre
  #SPR_OmbreTerre
  #SPR_Lune
  #SPR_OmbreLune
EndEnumeration

;*************initialisation**********************
InitSprite()
InitKeyboard()
InitSprite3D ()


OpenWindow (0, 0,0, 500, 300,#PB_Window_ScreenCentered|#PB_Window_SystemMenu , "Les phases de la Lune" ) ; on ouvre une fenetre
OpenWindowedScreen ( WindowID() , 0, 0, 500, 280, 0, 1, 1) ; on met un ecran dedans !!
CreateGadgetList(WindowID(0))
ButtonGadget(1,0,280,90,20,"jour=jour+1")
UsePNGImageDecoder()

;******************************sprite lune**************************************

LoadSprite(#SPR_Lune, "Lune.png", #PB_Sprite_Texture)
CreateSprite3D(#SPR_Lune, #SPR_Lune)
GrabSprite(#SPR_OmbreLune,100,132,16,16,#PB_Sprite_Texture) ;capture d'écran et création du sprite(6) lune
CreateSprite3D(#SPR_OmbreLune,#SPR_OmbreLune)

;***************************programme principal****************************************
Dim JM(12)
JJ=1
MM=1
mois=MM
AA=2006
y=AA
If MM<3
  MM=MM+12
  y=AA-1
EndIf

#Pi=3.14159265
ancien_alpha=167; variable qui mémorise le dernier angle alpha
Restore JourMois
For N=1 To 12
  Read JM(N)
Next N
Repeat ; boucle principale
  
  Repeat
    Event = WindowEvent()
    
    Select Event
      Case #PB_Event_CloseWindow
        End
        
      Case #PB_EventGadget ; bouton pour faire varier les jours
        Select EventGadgetID()
          Case 1
            JJ=JJ+1
            If JJ>JM(mois)
              JJ=1
              mois=mois+1
              MM=mois
            EndIf 
            If MM<3
              MM=MM+12
              y=AA-1
            EndIf
            If mois=>3
              y=AA
            EndIf
            ancien_alpha=K; transfert de alpha dans ancien_valeur           
        EndSelect 
    EndSelect
  Until Event = #Null
  
  ClearScreen(0,0,0); pour éviter que les écritures se superposent
  
  
  
  
  
  JD.f=Int(365.25*y)+Int(30.6001*(MM+1))+JJ+1720994.5+2-Int(y/100)+Int(Int(y/100)/4)
  T.f=(JD-2415020)/36525
  l.f=279.69+36000.76*T
  l=(l*#Pi)/180
  M.f=358.47+35999.05*T
  M=(M*#Pi)/180
  LS.f=l+0.0334928*Sin(M)
  P.f=((270.43+481267.88*T)*#Pi)/180
  MP.f=((296.10+477198.85*T)*#Pi)/180
  D.f=((350.74+445267.11*T)*#Pi)/180
  f.f=((11.25+483202.02*T)*#Pi)/180
  LL.f=P+0.1097812*Sin(MP)+0.0222354*Sin(2*D-MP)+0.01151917*Sin(2*D)+0.00366519*Sin(2*MP)-0.00331612*Sin(M)-0.00191986*Sin(2*f)
  b.f=0.0895004*Sin(f)+0.00488692*Sin(MP+f)+0.00488692*Sin(MP-f)+0.00314159*Sin(2*D-f)
  D.f=ACos(Cos(LL-LS)*Cos(b))
  i.f=#Pi-D-0.00261799*Sin(D)
  f.f=0.00872664*(1+Cos(i))
  AGE.f=(#Pi-i)*29.53/6.28
  f=f*180/#Pi
  alpha= i*180/#Pi 
  K=alpha; transfert de alpha (voir ancien_alpha)
  
  StartDrawing(ScreenOutput())
  DrawingMode(1)
  FrontColor(255,255,255)
  Locate(10,10)
  DrawText("Pour le "+Str(JJ)+" "+Str(mois)+" "+Str(AA))
  ; alpha est une fonction soit croissante, soit décroissante, on en tient compte pour dessiner la lune
  If ancien_alpha>=alpha 
    Locate(10,30)
    DrawText("Age de la lune= "+StrF(AGE,2)+" "+"Jours")
    If Cos(alpha*#Pi/180)<0
      Circle(468,32,32,RGB(128, 128, 128)) ;disque plein
      Ellipse(468,32,32*Cos(alpha*#Pi/180),32,RGB(0,0,0)) ;ellipse noire
      Box(436,0,32,64,RGB(0, 0, 0)) ; on efface la parite gauche du dessin
    Else
      Circle(468,32,32,RGB(128, 128, 128)) ;disque plein
      Box(436,0,32,64,RGB(0, 0, 0)) ; on efface la partie gauche du disque
      Ellipse(468,32,32*Cos(alpha*#Pi/180),32,RGB(128,128,128)) ;ellipse blanche
    EndIf
  EndIf
  
  If ancien_alpha<alpha
    AGE=Abs(AGE-29.53); Calcul pour obtenir l'âge de la lune entre 0 et 29.53 jours c'est à dire un cycle complet.
    Locate(10,30)
    DrawText("Age de la lune= "+StrF(AGE,2)+" "+"Jours")
    If Cos(alpha*#Pi/180)>0
      Circle(468,32,32,RGB(128, 128, 128))
      Box(468,0,32,64,RGB(0, 0, 0)) ;on efface la partie droite
      Ellipse(468,32,32*Cos(alpha*#Pi/180),32,RGB(128,128,128)) ;ellipse blanche 
    Else
      Circle(468,32,32,RGB(128, 128, 128))
      Box(468,0,32,64,RGB(0, 0, 0)) ;on efface la partie de droite
      Ellipse(468,32,32*Cos(alpha*#Pi/180),32,RGB(0,0,0)) ;ellipse noire
    EndIf
  EndIf
  
  
  
  StopDrawing()
  
  Start3D(); utilisation des effets de la 3D pour la rotation des sprites
  Sprite3DBlendingMode(5, 7) ; change le BlendingMode pour un meilleur effet
  DisplaySprite3D(#SPR_Lune, 437, 0, 128) ; ombrage lune (haut droit)  
  Stop3D()
  
  FlipBuffers () ; 
  
  
ForEver

DataSection
JourMois:
Data.l 31,28,31,30,31,30,31,31,30,31,30,31
EndDataSection

; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 137
; FirstLine = 87
; Folding = -
; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 118
; FirstLine = 26
; Folding = -
Je n'ai pas incréménté les années et je ne gère pas les années bissextiles, c'est simple à rajouter, mais pour moi ce n'est pas le problème, puisque la phase se dessine en fonction de la date fourni par l'ordinateur.
Voilà, encore merci pour ton aide et à charge de revanche si je peu t'aider pour un autre programme. :wink:
Bien que tu manies les sinus et les cos bien mieux que moi. :(

A+

André.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

..
Dernière modification par Backup le mar. 19/août/2014 15:46, modifié 2 fois.
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Bien joué les p'tits loups!!!

Prochaine étape, je vais mixer les codes (je vais en profiter pour rafraîchir le mien et mettre un peu d'ordre!!!)

Hasta la vista

@Dobro
Les datas ça me rappelle le bon vieux temps des listings sur ....MSX!.
Elevé au MSX !
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Psst!

Message par Huitbit »

Sur le code de Dobro, l'ombre et la lune sont décalées sur mon écran, j'ai du changer les coords d'affichage:

Code : Tout sélectionner

Start3D () ; utilisation des effets de la 3D pour la rotation des sprites 
  Sprite3DBlendingMode (5, 7) ; change le BlendingMode pour un meilleur effet 
  DisplaySprite3D ( #SPR_Lune , x_lune-31, 68, 128 ) ; ombrage lune (haut droit) 
  Stop3D () 
Est-ce normal???
Elevé au MSX !
Good07
Messages : 308
Inscription : ven. 23/avr./2004 18:08
Localisation : Hérault 34190 Laroque

petites précisions

Message par Good07 »

Bonsoir à tous.

Dobro a écrit:
sauf que dans ton listing tu ne lis pas la date de l'ordi

j'ai pas ajouté grand chose , je supose que t'avais oublié de poster le bon listing ...
Non, c'était le bon. Je voulais simplement dire que dans le programme que je développai, je prenai directement la date donnée par l'horloge de l'ordinateur. Mais pour l'exemple effectivement, je me contente d'incrémenter les jours à partir du premier Janvier 2006.

Arghh! j'avais pas lu le deuxième message de Huitbit et j'ai constaté la même chose. L'ombre et la lune sont décalées et du coup, j'ai fait la même correction. :wink:
La lune dans la Haute Loire ne doit pas avoir la même place. :D
Pour la présentation pas de problème, ça fait plus propre.
Merci à tous.

A+
André.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Arghh! j'avais pas lu le deuxième message de Huitbit et j'ai constaté la même chose.
quel Ane !! :? j'ai utilisé le code sans utiliser l'image !! :lol:

donc chez moi elle n'existait pas !! :lol:

bon j'ai corrigé le listing plus haut !! :oops: :oops: je retourne picoler moi ...
Avatar de l’utilisateur
Huitbit
Messages : 939
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

No problemo!
Tout est bien qui fini bien!

@Dobro
Super les anaglyphes!
A quand un jeu d'arcade en relief(est-ce que ça existe, sinon AU BOULOT!!!!!)?
C'est vrai ça, les gens s'embètent avec l'holographie, les casques virtuels, ...etc

Les lunettes en carton, c'est moins lourd, moins fragile et moins cher!!!!!
Elevé au MSX !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

@Good007 :
pourquoi tu mesure l'age de la lune avec la valeur 29.53 ??

alors que la lune pour faire le tour de la terre mets

27 jours 13 heures et 18 minutes !! ?? 8O :D
Répondre