PureBasic

Forums PureBasic
Nous sommes le Jeu 21/Nov/2019 13:07

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 51 messages ]  Aller à la page Précédente  1, 2, 3, 4  Suivante
Auteur Message
 Sujet du message:
MessagePosté: Sam 24/Déc/2005 13:46 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 09/Fév/2004 23:38
Messages: 1338
Localisation: Bordeaux
Joyeux Nowel ^_^"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 24/Déc/2005 18:06 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
Ma Version (atention soyez patient c'est lent !!) <- d'ailleurs je comprend pas pourquoi le point() sois si lent .....
si quelqu'un trouve pourquoi ça rame , je suis preneur ....

j'utilise le principe du Ray-tracing pour "eclairer" la terre et la lune

les rayons jaune symbolise le parcours des Photons ....


Citation:


; Code par Dobro !!
; system solaire
; avec raytracing pour l'affichage des parties éclairés


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
Dim soleil.soleil(1)

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

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

; ***********************************
Resultat = 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, #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "system solaire maintenir un appuis sur ESC pour quitter" )
    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 , 64,64)
     StartDrawing ( SpriteOutput ( #soleil ) ) ; on dessine dedans
     Circle (32, 32, 32 , RGB ($FF,$FF,$97))
     StopDrawing ()
    
     ; creation de la terre
     CreateSprite ( #terre , 32, 32)
     StartDrawing ( SpriteOutput ( #terre ) ) ; on dessine dedans
     Circle (16, 16, 16 , RGB ($71,$88,$F9))
     StopDrawing ()
    
     ; creation de la lune
     CreateSprite ( #lune , 16, 16)
     StartDrawing ( SpriteOutput ( #lune ) ) ; on dessine dedans
     Circle (8, 8, 8 , RGB ($A6,$A6,$A6))
     StopDrawing ()
    
    taille_du_cercle_terre=180
    taille_du_cercle_lune=50
    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-64
    soleil(1)\Y=EcranY/2-64
     Repeat
         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, 0, 0) : ;efface l'ecran
     Until Event= #PB_Event_CloseWindow
    
    
     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 250 Step 2
                coul= Point (RotationX(soleil(1)\X+32, i, distance) ,RotationY(soleil(1)\Y+32, 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+32, i, distance) , RotationY(soleil(1)\Y+32, i, distance),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+2) , RotationY(soleil(1)\Y+32, i, distance+2),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+4) , RotationY(soleil(1)\Y+32, i, distance+4),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+6) , RotationY(soleil(1)\Y+32, i, distance+6),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+8 ) , RotationY(soleil(1)\Y+32, i, distance+8 ),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+10) , RotationY(soleil(1)\Y+32, 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+32, i, distance) , RotationY(soleil(1)\Y+32, i, distance),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+1) , RotationY(soleil(1)\Y+32, i, distance+1),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+2) , RotationY(soleil(1)\Y+32, i, distance+2),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+3) , RotationY(soleil(1)\Y+32, i, distance+3),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+4) , RotationY(soleil(1)\Y+32, i, distance+4),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+5) , RotationY(soleil(1)\Y+32, i, distance+5),1,1,lumiere)
                    Break 1
                 Else
                    lumiere= RGB ($FF,$FF,$97) ; lumiere du soleil
                     Plot (RotationX(soleil(1)\X+32, i, distance) , RotationY(soleil(1)\Y+32, i, distance),lumiere)
                 EndIf
                 If KeyboardPushed ( #PB_Key_All )
                     End
                 EndIf
                 While WindowEvent () : Wend
             Next distance
            flag=0
         Next i
         StopDrawing ()
     EndProcedure




:D


Dernière édition par Backup le Dim 25/Déc/2005 12:33, édité 4 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 24/Déc/2005 18:16 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Mar/2004 11:23
Messages: 1500
Localisation: Sophia Antipolis (Nice)
Code:
     ; creation de notre ecran
     CreateSprite ( #ecran , EcranX, EcranY)
     If StartDrawing ( SpriteOutput ( #ecran ) )
       For etoiles=1 To 1000
          x_etoile= Random (EcranX)
          y_etoile= Random (EcranY)
          Plot ( x_etoile, y_etoile, RGB ($B1,$CD,$FC))
       Next etoiles
       StopDrawing ()
     EndIf

Plot() is outside a drawing area ... :?

_________________
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 24/Déc/2005 18:27 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
:lol: :lol: Corrigé .. Merci !

mais c'est toujours lent .. cela viens de la fonction Point() !!! :?


il suffit de mettre ne REM la ligne 132 (sur le listing actuelement present sur le forum....) pour se rendre compte du problem !! :?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Sam 24/Déc/2005 23:27 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Mar/2004 11:23
Messages: 1500
Localisation: Sophia Antipolis (Nice)
Tu peux m'expliquer pourquoi t'as deux "KillThread()", alors qu'il n'y a pas de CreateThread() ??? :lol:

_________________
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Dim 25/Déc/2005 0:56 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
lionel_om a écrit:
Tu peux m'expliquer pourquoi t'as deux "KillThread()", alors qu'il n'y a pas de CreateThread() ??? :lol:


ben tu sais ce que sait , c'est des résidus de test qui reste dans le code
bon c'est corrigé !! :D

je te previens si tu post un code , il a interet a etre nickel , car je vais pas te louper toi :lol: :lol:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Dim 25/Déc/2005 19:02 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
le meme code , mais sans le dessin de tout les rayon du soleil
on gagne un peu en vitesse :?

Citation:


; Code par Dobro !!
; system solaire
; avec raytracing pour l'affichage des parties éclairés


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
Dim soleil.soleil(1)

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

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

; ***********************************
Resultat = 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, #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "system solaire maintenir un appuis sur ESC pour quitter" )
    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 , 64,64)
     StartDrawing ( SpriteOutput ( #soleil ) ) ; on dessine dedans
     Circle (32, 32, 32 , RGB ($FF,$FF,$97))
     StopDrawing ()
    
     ; creation de la terre
     CreateSprite ( #terre , 32, 32)
     StartDrawing ( SpriteOutput ( #terre ) ) ; on dessine dedans
     Circle (16, 16, 16 , RGB ($71,$88,$F9))
     StopDrawing ()
    
     ; creation de la lune
     CreateSprite ( #lune , 16, 16)
     StartDrawing ( SpriteOutput ( #lune ) ) ; on dessine dedans
     Circle (8, 8, 8 , RGB ($A6,$A6,$A6))
     StopDrawing ()
    
    taille_du_cercle_terre=180
    taille_du_cercle_lune=50
    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-64
    soleil(1)\Y=EcranY/2-64
     Repeat
         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, 0, 0) : ;efface l'ecran
     Until Event= #PB_Event_CloseWindow
    
    
     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 250
                coul= Point (RotationX(soleil(1)\X+32, i, distance) ,RotationY(soleil(1)\Y+32, 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+32, i, distance) , RotationY(soleil(1)\Y+32, i, distance),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+2) , RotationY(soleil(1)\Y+32, i, distance+2),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+4) , RotationY(soleil(1)\Y+32, i, distance+4),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+6) , RotationY(soleil(1)\Y+32, i, distance+6),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+8 ) , RotationY(soleil(1)\Y+32, i, distance+8 ),2,2,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+10) , RotationY(soleil(1)\Y+32, 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+32, i, distance) , RotationY(soleil(1)\Y+32, i, distance),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+1) , RotationY(soleil(1)\Y+32, i, distance+1),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+2) , RotationY(soleil(1)\Y+32, i, distance+2),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+3) , RotationY(soleil(1)\Y+32, i, distance+3),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+4) , RotationY(soleil(1)\Y+32, i, distance+4),1,1,lumiere)
                     Box (RotationX(soleil(1)\X+32, i, distance+5) , RotationY(soleil(1)\Y+32, i, distance+5),1,1,lumiere)
                    Break 1
                 Else
                    lumiere= RGB ($FF,$FF,$97) ; lumiere du soleil
                     ; Plot(RotationX(soleil(1)\X+32, i, distance) , RotationY(soleil(1)\Y+32, i, distance),lumiere)
                 EndIf
                 If KeyboardPushed ( #PB_Key_All )
                     End
                 EndIf
                 While WindowEvent () : Wend
             Next distance
            flag=0
         Next i
         StopDrawing ()
     EndProcedure



Haut
 Profil  
Répondre en citant le message  
 Sujet du message: API Xmas
MessagePosté: Lun 26/Déc/2005 3:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
Faut que j'apprenne à faire des codes aussi clairs et détaillés!!!!!!!

Je suis un p'tit poil brouillon!

J'ai fait un copier/coller(j'ai pas pu résister) pour rajouter les étoiles dans ma version (pour celle de Cédéravic je crois que c'est bon pour les étoiles, c'est bon tout court!!!)

Cette version est cool car y a beaucoup moins de calculs (calculs nécessaires pour ce que je voulais!!!je les ai pas faits que pour le plaisir!), et les élèves......devinez!!!
LES ELEVES DETESTENT (à 99%) LES CALCULS!
Donc même si 1% doit râler, je vais peut être piocher dans ce prog si tu (Dobro) n'y vois pas d'inconvénients!!!

_________________
Elevé au MSX !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Lun 26/Déc/2005 11:09 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
Citation:
Donc même si 1% doit râler, je vais peut être piocher dans ce prog si tu (Dobro) n'y vois pas d'inconvénients!!!


ya une regle implicite sur le Forum ...

lorsqu'un code est mis sur le forum , il appartient a tous le monde (par defaut) , sinon on precise eventuellement qu'on est pas d'accord ,mais franchement je vois pas comment on ferai pour pas etre d'accord :lol: :lol:


la formule du cercle est la suivante :

Code:
X=taille_du_cercle* Cos( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2)
    Y=taille_du_cercle * Sin( compt*(2*3.1415926/nombre_de_point)) + (EcranY  / 2)


x= coordonée X du point a dessiner (ou du sprite a poser) (plot(x,y))
y=coordonée Y du point a dessiner (ou du sprite a poser) (plot(x,y))

taille du cercle = devine :D

compt , est juste un increment pour faire avancer le dessin (compt=compt+1)

EcranX / 2 = largeur de l'ecran divisé par 2 pour avoir le centre
EcranY / 2 = hauteur de l'ecran divisé par 2 pour avoir le centre
(bref on dessine au milieu de l'ecran)

nombre de point= le nombre de points composant le cercle )

c'est sur cette formule qu'est basé mon prg ... :D

suivant une petite aplication de cette formule ....(bouton droit pour sortir)


Citation:



; code by Dobro http://michel.dobro.free.fr/

#dobro =1
#Police =1
#Sprite =1
; ***********************************
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 50, #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, #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello" )
     WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse ()
    taille_du_cercle=200
    nombre_de_point=360 ; ceci determine la resolution (nombre de points)
     Repeat
         ExamineMouse ()
        Event= WaitWindowEvent ()
        
         StartDrawing ( ScreenOutput ())
        compt+1
         If compt=nombre_de_point :compt=0: EndIf ; on a fait le tour ??
        
        X=taille_du_cercle* Cos ( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2) ; la formule du cercle /360 = 360 points
        Y=taille_du_cercle * Sin ( compt*(2*3.1415926/nombre_de_point)) + (EcranY / 2) ; la formule du cercle
         Box (X, Y,2, 2 , RGB (255,255,255))
        
         StopDrawing ()
         FlipBuffers (): ; affiche l'ecran
        Event= WindowEvent ()
         If MouseButton (2)
             End
         EndIf
     Until Event= #PB_Event_CloseWindow




quant au
Citation:


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



ces procedures ne sont pas de moi (j'ai oublié qui me les a filé désolé ..)

elle te retourne les coordonées X et Y d'un point situé a "distance" et "angle" du point de depart

ex
point de depart x =50
point de depart y =50
angle= 45 degres
distance du point de depart = 100 pixel

la coordonée X d'arrivé est : 120.710678 (120) <-- ces fonction renvoi un Flottant
la coordonée Y d'arrivé est : 120.710678 (120)

ex :

Citation:


Declare.f RotationX(X, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)
#PI =3.1415926


X=50
Y=50
angle.f=45
dist=100

Debug RotationX(X, angle.f, dist)
Debug RotationY(Y, angle.f, dist)
End



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












:D


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Lun 26/Déc/2005 12:29 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
cet exemple exploite la formule du cercle et les procedures
qui permettent de connaitre un point d'arrivé lorsqu'on lui fourni une distance
et un angle , je m'en sert ici pour dessiner un triangle equilateral (angle de 120 degres ...)
+ le cercle , ce qui demontre une facilité a faire des dessins geometrique

a ce propos , j'ai fais un petit LOGO (le language informatique avec la tortue ) en purebasic ....
Mon Logo est simplifié , mais complet , avec les avantages ,d'une seule instruction par ligne , coloration et mise en forme de la syntax, ...
mais peut justement aidé a la representation dans l'espace , il est fourni avec un tas d'exemple
pour ton bahu si cela t'interresse ecris moi en MP

ex de listing PureGolo
ceci fabrique une toile d'arraignée ...
Code:
  CT
  let taille=100
  let demitaille={taille}/2
  let seuil=0
   pour [branche] 
     AV taille
     TD 60
     AV demitaille     
     RE demitaille
     TG 120
     let taille={taille}-4
     let seuil={seuil}+1
     ? 10,10 seuil
      si seuil>25
        saute fin
      sinon
        [branche]
      fin_si
   fin_pour
  [branche],taille,demitaille 

  fin:





et voici l'exemple du triangle et du cercle en purebasic :D
cela dessine un Shadok :lol:

Citation:



; code by Dobro http://michel.dobro.free.fr/
Declare.f RotationX(X, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)
#dobro =1
#Police =1
#Sprite =1
#PI =3.1415926
; ***********************************
Resultat = InitSprite ()
FontID = LoadFont ( #Police , "arial" , 50, #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, #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello" )
     WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    Resultat = InitMouse ()
    taille_du_cercle=200
    nombre_de_point=360 ; ceci determine la resolution (nombre de points)
     Repeat
         ExamineMouse ()
        Event= WaitWindowEvent ()
        
         StartDrawing ( ScreenOutput ())
        
        
         ; ******************* faire un cercle ********************************
        compt+1
         If compt=nombre_de_point :compt=0: EndIf ; on a fait le tour ??
        X=taille_du_cercle* Cos ( compt*(2*3.1415926/nombre_de_point)) + (EcranX / 2) ; la formule du cercle /360 = 360 points
        Y=taille_du_cercle * Sin ( compt*(2*3.1415926/nombre_de_point)) + (EcranY / 2) ; la formule du cercle
         ; ***********************************************
        
        
        
         ; ************ faire un triangle *****************
        
        angle.f=120 ; angle (triangle equilateral)
        dist=200 ; longueur d'un coté du triangle
         ; point 1
        x1=EcranX/2
        y1=EcranY/2
         ; point 2
        x2=RotationX(x1, angle.f+120, dist) ; les coordoné sont calculé en absolu pas en relatif !!
        y2=RotationY(y1, angle.f+120, dist) ; on est donc obligé de rejouter l'angla a la derniere position obtenu
         ; point 3
        x3=RotationX(x2, angle.f+120+120, dist)
        y3=RotationY(y2, angle.f+120+120, dist)
        
         ; dessin !
         LineXY (x1, y1, x2, y2 , RGB ($B1,$FC,$BD))
         LineXY (x2, y2, x3, y3 , RGB ($B1,$FC,$0))
         LineXY (x3, y3, x1, y1 , RGB ($0,$FC,$BD))
        
        
         ; ********************************************
        
        
        
         Box (X, Y,2, 2 , RGB (255,255,255))
        
         StopDrawing ()
         FlipBuffers (): ; affiche l'ecran
        Event= WindowEvent ()
         If MouseButton (2)
             End
         EndIf
     Until Event= #PB_Event_CloseWindow
    
    
     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



Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Lun 26/Déc/2005 14:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 09/Fév/2004 23:38
Messages: 1338
Localisation: Bordeaux
Je me suis ammusé à fait ça :
Code:
Soleil.Point
  Soleil\x = 400
  Soleil\y = 300

Terre.Point
TerreAngle.f

Lune.Point
LuneAngle.f

AnglePas.f = 0.06
AlphaTerre.f = (2 * #Pi) / 365
AlphaLune.f  = (2 * #Pi) / 21

RayTerreStart.Point
RayTerreEnd.Point

RayLuneStart.Point
RayLuneEnd.Point

RaySoleilStart.Point
RaySoleilEnd.Point

InitSprite()

OpenWindow(0, 0, 0, 800, 600, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget, "Système solaire")
  OpenWindowedScreen(WindowID(), 0, 0, 800, 600, 1, 0, 0)
 
  Repeat
   
    Repeat
   
      wEvent = WindowEvent()
      Select wEvent
       
        Case #WM_CLOSE
          Quit = #True
         
      EndSelect
   
    Until wEvent = #Null
   
    TerreAngle + AlphaTerre * AnglePas
    If TerreAngle > 2 * #Pi
      TerreAngle - 2 * #Pi
    EndIf
    LuneAngle + AlphaLune * AnglePas
    If LuneAngle > 2 * #Pi
      LuneAngle - 2 * #Pi
    EndIf
   
    Terre\x = 128 * Cos(-TerreAngle) + Soleil\x
    Terre\y = 128 * Sin(-TerreAngle) + Soleil\y
   
    Lune\x = 48 * Cos(-LuneAngle) + Terre\x
    Lune\y = 48 * Sin(-LuneAngle) + Terre\y
   
    RaySoleilStart\x = 32 * Cos(-TerreAngle - #Pi / 2) + Soleil\x
    RaySoleilStart\y = 32 * Sin(-TerreAngle - #Pi / 2) + Soleil\y
    RaySoleilEnd\x = 32 * Cos(-TerreAngle + #Pi / 2) + Soleil\x
    RaySoleilEnd\y = 32 * Sin(-TerreAngle + #Pi / 2) + Soleil\y
   
    RayTerreStart\x = 16 * Cos(-TerreAngle - #Pi / 2) + Terre\x
    RayTerreStart\y = 16 * Sin(-TerreAngle - #Pi / 2) + Terre\y
    RayTerreEnd\x = 16 * Cos(-TerreAngle + #Pi / 2) + Terre\x
    RayTerreEnd\y = 16 * Sin(-TerreAngle + #Pi / 2) + Terre\y
   
    RayLuneStart\x = 8 * Cos(-TerreAngle - #Pi / 2) + Lune\x
    RayLuneStart\y = 8 * Sin(-TerreAngle - #Pi / 2) + Lune\y
    RayLuneEnd\x = 8 * Cos(-TerreAngle + #Pi / 2) + Lune\x
    RayLuneEnd\y = 8 * Sin(-TerreAngle + #Pi / 2) + Lune\y
   
    ClearScreen(0, 0, 0)
   
    StartDrawing(ScreenOutput())
     
      DrawingMode(0)
        Circle(Soleil\x, Soleil\y, 32, RGB(200, 200, 20))  ; le soleil
        Circle(Terre\x , Terre\y , 16, RGB(20, 20, 200))   ; la terre
        Circle(Lune\x  , Lune\y  , 8 , RGB(128, 128, 128)) ; la lune
       
      DrawingMode(4)
        Circle(Soleil\x, Soleil\y, 128, RGB(200, 20, 20))
        Circle(Terre\x, Terre\y, 48, RGB(200, 20, 20))

        LineXY(RaySoleilStart\x, RaySoleilStart\y, RayTerreStart\x, RayTerreStart\y, RGB(20, 200, 20))
        LineXY(RaySoleilEnd\x, RaySoleilEnd\y, RayTerreEnd\x, RayTerreEnd\y, RGB(20, 200, 20))
        LineXY(RayTerreStart\x, RayTerreStart\y, RayTerreEnd\x, RayTerreEnd\y, RGB(20, 200, 20))
       
        LineXY(RaySoleilStart\x, RaySoleilStart\y, RayLuneStart\x, RayLuneStart\y, RGB(20, 200, 20))
        LineXY(RaySoleilEnd\x, RaySoleilEnd\y, RayLuneEnd\x, RayLuneEnd\y, RGB(20, 200, 20))
        LineXY(RayLuneStart\x, RayLuneStart\y, RayLuneEnd\x, RayLuneEnd\y, RGB(20, 200, 20))
       
        LineXY(400, 0, 400, 600, RGB(255, 255, 255))
        LineXY(0, 300, 800, 300, RGB(255, 255, 255))
       
        LineXY(0, Terre\y, 800, Terre\y, RGB(20, 20, 200))
        LineXY(Terre\x, 0, Terre\x, 600, RGB(20, 20, 200))
       
        LineXY(0, Lune\y, 800, Lune\y, RGB(128, 128, 128))
        LineXY(Lune\x, 0, Lune\x, 600, RGB(128, 128, 128))
   
    StopDrawing()
   
    FlipBuffers()
 
  Until Quit = #True


Changez la valeur de AnglePas pour accélérer / déccélerer


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 27/Déc/2005 20:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 08/Déc/2005 5:19
Messages: 936
Localisation: Guadeloupe
Super,

Toutes ces sources me seront bien utiles!
en ce moment, j'essaye de faire des tutos simples pour chaque fonction utilisé ( progs les plus courts possibles pour tracer une droite, dessiner une boîte, un disque, afficher un sprite, faire tourner un sprite, afficher du texte, poser une question et traiter une réponse, gerer les évenements de la souris, ceux du clavier... bref, tous les outils nécessaires pour qu'un débutant soit autonome (prof ou élève).
Les exemples de l'aide sont biens mais souvent regroupent plusieurs fonctions en même temps.

Je fais ça car même si un prof n'a pas le temps de faire de la prog avec ses élèves au moins il peut développer ses propres applications( au lieu d'utiliser les progs nazes à 10 000$ qu'on nous envoie!)

Je vais essayer de motiver les autres établissements de l'académie en envoyant des démos (ex: phases de la Lune...) et en proposant des tutos sur le site de mon lycée.

Dobro> dans ton code y a un "getsystemmetrics", je trouve pas ce mot dans l'aide, apparemment ça permet d'avoir des infos sur l'affichage, d'où ça vient?
Ta tortue m'interesse (ça force les élèves à donner des instructions dans un ordre logique!!), mais pour l'instant je suis aussi dans les copies et la préparation de contrôles(hé oui) en plus ma girlfriend squatte l'ordi pour jouer à un jeu "tumblebug" ( c'est un jeu de boules!!!!il ne lui manque qu'un niveau alors elle s'acharne!!)
Psst j'ai pas envoyé un MP car je sais pas!!(j'ai honte!!!)

Hasta la vista

_________________
Elevé au MSX !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mar 27/Déc/2005 22:31 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
Citation:
Dobro> dans ton code y a un "getsystemmetrics", je trouve pas ce mot dans l'aide, apparemment ça permet d'avoir des infos sur l'affichage, d'où ça vient?


Code:
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran


cette fonction est suivi d'un "_" c'est pas "GetSystemMetrics" mais
GetSystemMetrics_ <-- le "_" indique a purebasic qu'il sagit d'une API windows !!! donc il te faut la doc des APIs si tu veut comprendre ...
en l'occurence ça retourne la taille de l'ecran (la resolution) :D
ça pourrai se remplacer par "ScreenModeWidth()" qui est la fonction purebasic qui s'en raproche le plus !!

en effet la particularité de PureBasic , c'est de pouvoir utiliser les API windows aussi simplement (en principe) que des fonctions Purebasic
(recherche "API windows" sur Google...)




Citation:
Psst j'ai pas envoyé un MP car je sais pas!!(j'ai honte!!!)


tu clique sur le bouton [pm] situé en bas de ce message ..
et le message prive me sera adressé (car je suis l'ecrivain de ce message)


tu peut consulter tes messages privés avec l'option tout en haut de la page .. :D
soit c'est écrit "Vous n'avez pas de nouveaux messages "
soit "vous avez x messages "

[/quote]


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Mer 28/Déc/2005 19:42 
Hors ligne

Inscription: Lun 26/Avr/2004 0:40
Messages: 14535
Dobro a écrit:
quant au
Citation:


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



ces procedures ne sont pas de moi (j'ai oublié qui me les a filé désolé ..)

elle te retourne les coordonées X et Y d'un point situé a "distance" et "angle" du point de depart

ex
point de depart x =50
point de depart y =50
angle= 45 degres
distance du point de depart = 100 pixel

la coordonée X d'arrivé est : 120.710678 (120) <-- ces fonction renvoi un Flottant
la coordonée Y d'arrivé est : 120.710678 (120)

ex :

Citation:


Declare.f RotationX(X, angle.f, dist)
Declare.f RotationY(Y, angle.f, dist)
#PI =3.1415926


X=50
Y=50
angle.f=45
dist=100

Debug RotationX(X, angle.f, dist)
Debug RotationY(Y, angle.f, dist)
End



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












:D



Citation:
ces procedures ne sont pas de moi (j'ai oublié qui me les a filé désolé ..)


ben j'ai retrouvé qui me les avaient filés ces procedures

c'est :

Lionel_om :D


donc merci a lui ! ...............


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: Ven 30/Déc/2005 11:35 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 25/Mar/2004 11:23
Messages: 1500
Localisation: Sophia Antipolis (Nice)
Dobro a écrit:
lionel_om a écrit:
Tu peux m'expliquer pourquoi t'as deux "KillThread()", alors qu'il n'y a pas de CreateThread() ??? :lol:


ben tu sais ce que sait , c'est des résidus de test qui reste dans le code
bon c'est corrigé !! :D

je te previens si tu post un code , il a interet a etre nickel , car je vais pas te louper toi :lol: :lol:

Oops, j'ai dis qqchose qu'il fallait pas dire ??? :lol:

Dobro a écrit:
ces procedures ne sont pas de moi (j'ai oublié qui me les a filé désolé ..)

ben j'ai retrouvé qui me les avaient filés ces procedures
c'est :
Lionel_om :D
donc merci a lui ! ...............

De rien !!! :lol:

_________________
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 51 messages ]  Aller à la page Précédente  1, 2, 3, 4  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye