Oscilloscope

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Oscilloscope

Message par flaith »

Pour passer le temps, pour m'amuser et comprendre un peu les fonctions sinus et cosinus, j'ai fait ce petit programme

:D

Code : Tout sélectionner

If InitSprite() = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran & l'environnement nécessaire aux sprites !", 0)
  End
EndIf

#width = 320
#height = 240
theta.f = 0.0 : x = 0 : y = 0 : frame.f = 0.0 : pas.f = 45.0 : div = 1 : DoCos = 1

If OpenWindow(0, 0, 0, #width+70, #height, "Oscilloscope...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, #width+10, #height-25, 55, 20, "Quitter")
    TextGadget(5, #width+3, 5, 32, 20, "Pas", #PB_Text_Center|#PB_Text_Border)
    TextGadget(6, #width+38, 5, 32, 20, "Haut", #PB_Text_Center|#PB_Text_Border)
    TrackBarGadget(1, #width+5, 27, 20, #height-80, 0, 100, #PB_TrackBar_Vertical)
    SetGadgetState(1, pas)

    CheckBoxGadget(7, #width+32, 27, 40, 15, "Cos") : SetGadgetState(7,DoCos)

    TrackBarGadget(2, #width+40, 42, 20, #height-80-15, 1, 10, #PB_TrackBar_Vertical)
    SetGadgetState(2, div)
    TextGadget(3, #width+5, #height-50, 30, 20, Str(pas), #PB_Text_Center|#PB_Text_Border)
    TextGadget(4, #width+40, #height-50, 30, 20, Str(div), #PB_Text_Center|#PB_Text_Border)
  EndIf
  If OpenWindowedScreen(WindowID(0), 0, 0, #width, #height, 0, 0, 0)
    CreateSprite(0, 4, 4)
    If StartDrawing(SpriteOutput(0))
      Box(0, 0, 4, 4, RGB(255, 0, 255))
      Box(1, 0, 2, 4, RGB(127, 200, 127))
      Box(0, 1, 4, 2, RGB(127, 200, 127))
      Box(1, 1, 2, 2, RGB(0, 255, 0))
      StopDrawing()
    EndIf
    TransparentSpriteColor(0,$FF00FF)
    
    CreateSprite(1, #width, #height)
   	If StartDrawing(SpriteOutput(1))
 	  
 	    For i = 0 To #width - 1 Step #height/12 ;20
        LineXY(i,0,i,#height-1,$1F1F1F)
      Next i

 	    For i = 0 To #height - 1 Step #height/12 ;20
        LineXY(0,i,#width-1,i,$1F1F1F)
      Next i
    
      LineXY(0,#height/2,#width-1,#height/2,$AFAFAF)
      LineXY(#width/2,0,#width/2,#height,$AFAFAF)
    
      For i = #width/16 To #width - 1 Step #height/12 ;20
        LineXY(i,(#height/2)-5,i,(#height/2)+5,$AFAFAF)
      Next i
    
      For i = #width/16 To #height - 1 Step #height/12 ;20
        LineXY((#width/2)-5,i,(#width/2)+5,i,$AFAFAF)
      Next i

      StopDrawing()
    EndIf
    
  Else
    MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0)
    End
  EndIf
EndIf

#RAD_TO_DEG = 57.29577951308232087  ;57.2957795130823208767981548141052    = valeur de la conversion de radian en degré
#DEG_TO_RAD =  0.01745329251994329  ; 0.0174532925199432957692369076848861 = valeur de la conversion de degré en radian

Macro DegCos(val)
  Cos(val / #RAD_TO_DEG)
EndMacro

Macro DegSin(val)
  Sin(val / #RAD_TO_DEG)
EndMacro

Repeat
  Repeat
    Event = WindowEvent()
    
    Select Event 
      Case #PB_Event_Gadget
        If EventGadget() = 0
          End
        EndIf

        If EventGadget() = 1
          pas = GetGadgetState(1)
          SetGadgetText(3,Str(pas))
        EndIf

        If EventGadget() = 2
          div = GetGadgetState(2)
          SetGadgetText(4,Str(div))
        EndIf
      
        If EventGadget() = 7
          DoCos = 1 - DoCos
          SetGadgetState(7,DoCos)
        EndIf

      Case #PB_Event_CloseWindow
        End 
    EndSelect
  Until Event = 0

  FlipBuffers()
  ClearScreen(RGB(0, 0, 0))

  DisplaySprite(1,0,0)
  
  For x = 0 To #width - 1
    theta = x + frame
    Select DoCos
      Case 0
	      y = ((#height-4) / 2) - DegSin(theta) * (#height / 2) ;-4 à cause de la hauteur du sprite
	    Case 1
	      y = ((#height-4) / 2) - DegSin(theta) * (#height / 2) * ( DegCos(theta) / div )
	  EndSelect
	
 	  DisplayTransparentSprite(0,x,y)
  Next
  frame = frame + pas               ;vitesse de défilement
  Delay(25)                         ;valeur pour donner du temps au processeur sinon process à 98%
ForEver
note: J'ai noté que PB ne prenait que 17 chiffres après la virgule ...

** EDIT ** : modification de certains paramètres pour la grille, en changeant la résolution, la grille change aussi ;)
Dernière modification par flaith le ven. 22/déc./2006 14:02, modifié 1 fois.
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Message par KarLKoX »

Nickel :)
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Sympa
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

c'est aussi toi qui a fait cet oscilloscope?

Télécharger

[EDIT]
Je n'avais pas vu , il y a même les sources, je vais y jeter un oeil.
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message par flaith »

comtois a écrit :c'est aussi toi qui a fait cet oscilloscope?
Et bien non, ce n'est pas moi, d'ailleurs je viens d'essayer de le tester, pb dans la dll présente dans le zip, fichier erroné, tant pis ...
Répondre