Rappresentare su una DrawingArea l'onda oscillante di una serie di dati

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca

Con il seguente codice mostreremo un possibile esempio, per poter rappresentare su una DrawingArea l'onda oscillante di una serie di dati, ottenuti in questo caso in modo casuale.

Private Const AMPIEZZA As Integer = 1
Private DrawingArea1 As DrawingArea
Private Timer1 As Timer
Private punti As New Integer[][]
Private posy As Integer


Public Sub _new()

 Randomize 

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .W = 400
   .H = 200
   .Background = Color.Black
 End With
 
 Timer1 = New Timer As "Timer1"
 
' Genera tanti punti quanto è ampia l'area di disegno:
 punti.Resize(DrawingArea1.Width) 
 
' Per evitare valori nulli, assegna a ogni indice dell'array valori [0, 0]:
 For i As Integer = 0 To DrawingArea1.Width - 1 
   punti[i] = [0, 0]
 Next

' Assegna il primo punto partendo da x = 0, y = metà dell'altezza dell'area di disegno:
 punti[0] = [0, DrawingArea1.H / 2]  

' Crea un array di punti con posizioni che variano tra -1 e 1:
 PosizionaPunti() 

 Timer1.Delay = 200
 Timer1.Start

End


Private Procedure PosizionaPunti()

' Il valore x aumenta di 0 fino alla larghezza dell'area di disegno.
' Abbiamo la posizione del primo punto.
 For i As Integer = 1 To DrawingArea1.Width - 1
' Genera valori tra -1 e 1:
   posy = Int(Rnd(-1, 2))
   punti[i][0] = i
   punti[i][1] = punti[i - 1][1] + posy

   If punti[i][1] <= 1 Then 
     punti[i][1] += 1
   Else If punti[i][1] >= DrawingArea1.Height - 1 Then
     punti[i][1] -= 1    
   Endif
 Next

End


Public Sub DrawingArea1_Draw()

 Paint.LineWidth = AMPIEZZA
 For i As Integer = 0 To punti.Max
   Paint.FillRect(punti[i][0], punti[i][1], AMPIEZZA, AMPIEZZA, Color.Yellow)
 Next

 PosizionaPunti() 

End


Public Sub Timer1_Timer()

 DrawingArea1.Refresh

End