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

Message par Huitbit »

Psst!
Il y a deux principaux types de périodes(il y en a d'autres!!!):

la sidérale (par rapport aux étoiles lointaintes, imagine que tu te débarrasses de tout sauf de la Lune et que tu la regardes tourner, elle mettra 27j13h pour faire un tour complet)

la synodique(celle qui correspond aux phases de la lune) qui est déterminée par rapport au Soleil.
En fait c'est le temps que prend un point de la lune pour revenir à la même position par rapport au soleil. On a 29,53j car pendant le mois lunaire, la lune se déplace avec la terre et se déplace donc par rapport au soleil.

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

Message par Backup »

ha ok ! :D
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

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

Message par Zorro »

Mise a jour de mon code plus haut

Code : Tout sélectionner



; Code par Dobro !!
; system solaire
; avec "raytracing"  pour l'affichage des parties éclairés de la lune et de la terre


Declare.f RotationX(X, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)
Declare calcul()
;#PI =3.1415926
Enumeration
		#dobro
		#Police
		#soleil
		#terre
		#lune
		#ecran
EndEnumeration

Structure soleil
		X.l
		Y.l
EndStructure
Global Dim soleil.soleil(1)

Structure lune
		X.l
		Y.l
EndStructure
Global Dim lune.lune(1)

Structure terre
		X.l
		Y.l
EndStructure
Global Dim terre.terre(1)

; ***********************************
If InitSprite()
		FontID = LoadFont ( #Police , "arial" , 18, #PB_Font_Bold )
		EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
		EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
		WindowID = OpenWindow (1, 0, 0,EcranX, EcranY, "system solaire maintenir un appuis sur ESC pour quitter" ,#PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered )
		Result = OpenWindowedScreen ( WindowID (1) ,0,0,EcranX, EcranY, 1, 0,0)
		
		Resultat = InitMouse ()
		Resultat = InitKeyboard ()
		
		; creation de notre ecran
		CreateSprite ( #ecran , EcranX, EcranY)
		StartDrawing ( SpriteOutput ( #ecran ) )
				For etoiles=1 To 1000
						x_etoile= Random (EcranX-10)+5
						y_etoile= Random (EcranY-10)+5
						Plot ( x_etoile, y_etoile, RGB ($B1,$CD,$FC))
				Next etoiles
		StopDrawing ()
		
		; creation du soleil
		CreateSprite ( #soleil ,128,128)
		StartDrawing ( SpriteOutput ( #soleil ) ) ; on dessine dedans
				Circle (64, 64, 64 , RGB ($FF,$FF,$97))
		StopDrawing ()
		
		; creation de la terre
		CreateSprite ( #terre , 64, 64)
		StartDrawing ( SpriteOutput ( #terre ) ) ; on dessine dedans
				Circle (32, 32, 32 , RGB ($71,$88,$F9))
		StopDrawing ()
		
		; creation de la lune
		CreateSprite ( #lune , 32, 32)
		StartDrawing ( SpriteOutput ( #lune ) ) ; on dessine dedans
				Circle (16, 16, 16 , RGB ($A6,$A6,$A6))
		StopDrawing ()
		
		taille_du_cercle_terre=360
		taille_du_cercle_lune=100
		nombre_de_jour_terre=360 ; ceci determine la resolution (nombre de points)
		nombre_de_jour_lune=21 ; ceci determine la resolution (nombre de points)
		soleil(1)\X=EcranX/2-128
		soleil(1)\Y=EcranY/2-128
		
		Repeat
				While WindowEvent () : Wend 
				ExamineMouse ()
				ExamineKeyboard ()
				WindowEvent ()
				;Delay (2)
				
				If MouseButton (2)
						End
				EndIf
				
				compt_terre+1
				compt_lune+1
				If compt_terre=nombre_de_jour_terre :compt_terre=0: EndIf ; on a fait le tour ??
				If compt_lune=nombre_de_jour_lune :compt_lune=0: EndIf ; on a fait le tour ??
				
				
				terre(1)\X=taille_du_cercle_terre* Cos ( compt_terre*(2*3.1415926/nombre_de_jour_terre)) + (soleil(1)\X+8 ) ; la formule du cercle /360 = 360 points
				terre(1)\Y=taille_du_cercle_terre * Sin ( compt_terre*(2*3.1415926/nombre_de_jour_terre)) + (soleil(1)\Y+8 ) ; la formule du cercle
				
				lune(1)\X=taille_du_cercle_lune* Cos ( compt_lune*(2*3.1415926/nombre_de_jour_lune)) + (terre(1)\X) ; la formule du cercle /360 = 360 points
				lune(1)\Y=taille_du_cercle_lune * Sin ( compt_lune*(2*3.1415926/nombre_de_jour_lune)) + (terre(1)\Y) ; la formule du cercle
				
				
				calcul() ; saut vers le raytracing maison :-)
				
				FlipBuffers (): ; affiche l'ecran
				ClearScreen ($0) : ;efface l'ecran
		Until Event= #PB_Event_CloseWindow
		Else
		MessageRequester("erreur","Mettez OPENGL en Sous system")
Endif
Procedure.f RotationX(X, angle.f, dist)
		ProcedureReturn X + Cos (angle.f* #PI /180)*dist
EndProcedure


Procedure.f RotationY(Y, angle.f, dist)
		ProcedureReturn Y + Sin (angle.f* #PI /180)*dist
EndProcedure

Procedure calcul()
		DisplaySprite ( #ecran , 0, 0)
		DisplayTransparentSprite ( #soleil , soleil(1)\X, soleil(1)\Y)
		DisplayTransparentSprite ( #terre , terre(1)\X, terre(1)\Y)
		DisplayTransparentSprite ( #lune , lune(1)\X, lune(1)\Y)
		lumiere= RGB ($FF,$FF,$97) ; lumiere du soleil
		StartDrawing ( ScreenOutput ())
				For i=1 To 360
						For distance=100 To 440
								coul= Point (RotationX(soleil(1)\X+64, i, distance) ,RotationY(soleil(1)\Y+64, i, distance))
								If coul= RGB ($71,$88,$F9) ;la lumiere rencontre la terre
										lumiere= RGB ($FF,$FF,$97) ; lumiere du soleil
										Box (RotationX(soleil(1)\X+64, i, distance) , RotationY(soleil(1)\Y+64, i, distance),2,2,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+2) , RotationY(soleil(1)\Y+64, i, distance+2),2,2,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+4) , RotationY(soleil(1)\Y+64, i, distance+4),2,2,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+6) , RotationY(soleil(1)\Y+64, i, distance+6),2,2,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+8 ) , RotationY(soleil(1)\Y+64, i, distance+8 ),2,2,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+10) , RotationY(soleil(1)\Y+64, i, distance+10),2,2,lumiere)
										Break 1
								ElseIf coul= RGB ($A6,$A6,$A6) ;la lumiere rencontre la lune
										lumiere= RGB ($FF,$FF,$97) ; lumiere du soleil
										
										Box (RotationX(soleil(1)\X+64, i, distance) , RotationY(soleil(1)\Y+64, i, distance),1,1,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+1) , RotationY(soleil(1)\Y+64, i, distance+1),1,1,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+2) , RotationY(soleil(1)\Y+64, i, distance+2),1,1,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+3) , RotationY(soleil(1)\Y+64, i, distance+3),1,1,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+4) , RotationY(soleil(1)\Y+64, i, distance+4),1,1,lumiere)
										Box (RotationX(soleil(1)\X+64, i, distance+5) , RotationY(soleil(1)\Y+64, i, distance+5),1,1,lumiere)
										Break 1
								Else
										lumiere= RGB ($FF,$FF,$97) ; lumiere du soleil
										Plot(RotationX(soleil(1)\X+64, i, distance) , RotationY(soleil(1)\Y+64, i, distance),lumiere)
								EndIf
								If KeyboardPushed ( #PB_Key_All )
										End
								EndIf
								While WindowEvent () : Wend
						Next distance
						flag=0
				Next i
		StopDrawing ()
EndProcedure






Dernière modification par Zorro le lun. 09/avr./2018 4:58, modifié 1 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message par Ar-S »

Lorsque je lance ton prog j'ai mon GPU qui passe à 93% et la fenêtre reste vide même sans debug.. Y'a un truc qui cloche.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

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

Message par Zorro »

Pour que ça marche il faut choisir "OPENGL" en sous system :)

ça reste lent, car la procedure Calcul est effectué en temps réel , pas de précalcul
et il y a la fonction point() qui regarde si les rayons du soleil touchent la lune ou la terre ....
une forme de "Raytracing" du pauvre :)


c'est un vieux code que j'ai remis a PB 5.62
j'ai ajouté un Requester() pour signaler qu'il faut passer en 'OpenGL' :)

par contre,ne me demande pas pourquoi ça ne marche pas en DirectX ou sans rien ...
dans le temps on n'avait pas ce genre de probleme :roll:

entre ça et les problemes soulevés par unicod , je suis pas sur qu'on va dans le bon sens :lol:
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message par Ar-S »

vivement DirectX Raytracing

En OpenGl c'est très fluide si on vire le debugger.
P.S : Ce serait bien de pouvoir imposer dans le code le sous système genre :

Code : Tout sélectionner

Select SubSystem() 
case #PB_SubSystem_OpenGl
...
case #PB_SubSystem_Dx9
...
endselect
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre