Disegnare in una DrawingArea un goniometro

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

Per disegnare su una DrawingArea un semplice quadrante del goniometro, si potrà adottare il seguente codice: [nota 1]

Private DrawingArea1 As DrawingArea
Private FINEANGOLO As Short = 360


Public Sub Form_Open()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Background = Color.Lighter(Color.Yellow)
 End With

End


Public Sub DrawingArea1_Draw()
 
 Dim rag, an As Short

 rag = DrawingArea1.H * 0.4
 
 With Paint
   .Brush = Paint.Color(Color.Blue)
   For an = 0 To FINEANGOLO - 10 Step 10
     .Text(CStr(an), (DrawingArea1.W / 2) + (rag + 20) * -Sin(Rad(-an)), (DrawingArea1.H / 2) - (rag + 20) * Cos(Rad(-an)))
   Next
   .Stroke
   .Brush = Paint.Color(Color.Red)
   .LineWidth = 3.0
   .Arc(DrawingArea1.W / 2 + 10, DrawingArea1.H / 2 - 6, rag, Rad(0), Rad(360), False)
   .Stroke
   .End
 End With
 
End

Un altro codice possibile:

Public Sub Form_Open()

 Me.Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)

 Me.Arrangement = Arrange.Fill

 DrawingArea1.Refresh

End


Public Sub DrawingArea1_Draw()

' Centro orizzontale e verticale della DrawingArea:
 Dim cx, cy As Integer
' Raggio del goniometro con margine per non uscire dai bordi:
 Dim r As Integer
' Variabile per angolo in gradi:
 Dim a As Integer
' Coordinate per le tacche:
 Dim x1, y1, x2, y2 As Float
' Angolo in radianti, calcolato da gradi:
 Dim angleRad As Float

 cx = DrawingArea1.Width / 2              ' Centro X
 cy = DrawingArea1.Height / 2             ' Centro Y
 r = Min(cx, cy) - 40                     ' Raggio con margine

 Paint.Arc(cx - r, cy - r, r * 2, r * 2, 0, 360)  ' Disegna cerchio completo

 For a = 0 To 360 Step 10                 ' Ciclo da 0 a 360 gradi, step 10°

   angleRad = Rad(a)                      ' Conversione gradi -> radianti

' Coordinate esterne della tacca (sulla circonferenza):
   x1 = cx + Cos(angleRad) * r
   y1 = cy + Sin(angleRad) * r

' Coordinate interne della tacca (più corta o più lunga):
   If a Mod 30 = 0 Then
     x2 = cx + Cos(angleRad) * (r - 20)   ' Tacca lunga ogni 30°
     y2 = cy + Sin(angleRad) * (r - 20)
   Else
     x2 = cx + Cos(angleRad) * (r - 10)   ' Tacca corta ogni 10°
     y2 = cy + Sin(angleRad) * (r - 10)
   EndIf

   Paint.MoveTo(x1, y1)                  ' Inizio linea tacca
   Paint.LineTo(x2, y2)                  ' Fine linea tacca

' Disegna numeri ogni 30°, escluso il 360 per non sovrapporre lo 0:
   If a Mod 30 = 0 And a <> 360 Then
     Dim tx, ty As Float
' Posizione testo leggermente più interno rispetto alla tacca lunga:
     tx = cx + Cos(angleRad) * (r - 35)
     ty = cy + Sin(angleRad) * (r - 35)

     Paint.Font.Size = 10                ' Dimensione font
     Paint.Text(Str(a), tx - 10, ty - 6, 20, 12, Align.Center)  ' Disegna numero angolo
   End If

 Next

' Linea orizzontale centrale (diametro):
 Paint.MoveTo(cx - r, cy)
 Paint.LineTo(cx + r, cy)

' Linea verticale centrale (diametro):
 Paint.MoveTo(cx, cy - r)
 Paint.LineTo(cx, cy + r)

 Paint.Stroke()                          ' Applica il disegno

End


Note

[1] Vedere anche: Disegnare in una DrawingArea un cerchio