Disegnare in una DrawingArea un goniometro: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 7: Riga 7:
   
   
   With Me
   With Me
     .W = Screen.AvailableWidth
     .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
    .H = Screen.AvailableHeight
     .Arrangement = Arrange.Fill
     .Arrangement = Arrange.Fill
   End With
   End With
Riga 19: Riga 18:
   
   
  Public Sub DrawingArea1_Draw()
  Public Sub DrawingArea1_Draw()
 
  Dim rag, an As Short
   
   
   rag = DrawingArea1.H * 0.4
<FONT Color=gray>' ''Raggio del cerchio su cui posizionare i numeri, pari al 40% dell'altezza dell'area di disegno:''</font>
   Dim rag As Short = DrawingArea1.H * 0.4
<FONT Color=gray>' ''Coordinate del centro del DrawingArea (centro del cerchio):''</font>
  Dim cx As Float = DrawingArea1.W / 2
  Dim cy As Float = DrawingArea1.H / 2
  Dim label As String        <FONT Color=gray>' ''Variabile per contenere il testo (numero) da disegnare''</font>
  Dim an As Short            <FONT Color=gray>' ''Variabile per l'angolo corrente in gradi''</font>
  Dim textW, textH As Float  <FONT Color=gray>' ''Larghezza e altezza del testo da disegnare''</font>
  Dim correctionY As Float  <FONT Color=gray>' ''Correzione verticale empirica per centrare visivamente il testo''</font>
  Dim x, y As Float          <FONT Color=gray>' ''Coordinate di posizionamento del testo''</font>
    
    
   With Paint
   With Paint
<FONT Color=gray>' ''Imposta il colore del pennello per il testo:''</font>
     .Brush = Paint.Color(Color.Blue)
     .Brush = Paint.Color(Color.Blue)
<FONT Color=gray>' ''Ciclo per disegnare i numeri da 0 a 350 gradi, con passo di 10 gradi:''</font>
     For an = 0 To FINEANGOLO - 10 Step 10
     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)))
<FONT Color=gray>' ''Converte l'angolo corrente in stringa per disegnare il numero:''</font>
       label = CStr(an)
<FONT Color=gray>' ''Calcola la larghezza e l'altezza del testo (numero) usando il font corrente:''</font>
      textW = DrawingArea1.Font.TextWidth(label)
      textH = DrawingArea1.Font.TextHeight(label)
<FONT Color=gray>' ''Valore empirico per correggere l'offset verticale del testo, per farlo sembrare visivamente centrato:''</font>
      correctionY = textH * 0.35
<FONT Color=gray>' ''Calcola la coordinata X del punto sul cerchio dove posizionare il testo''
' ''Coseno usato per partire da destra (0 gradi sull'asse X positivo)''
' ''Sottrae metà larghezza testo per centrarlo orizzontalmente.''</font>
      x = cx + (rag + 20) * Cos(Rad(an)) - (textW / 2)
<FONT Color=gray>' ''Calcola la coordinata Y del punto sul cerchio dove posizionare il testo.''
' ''Seno per posizione verticale lungo la circonferenza.''
' ''Aggiunge la correzione verticale per un migliore allineamento visivo.''</font>
      y = cy + (rag + 20) * Sin(Rad(an)) + correctionY
<FONT Color=gray>' ''Disegna il testo (numero) nella posizione calcolata:''</font>
      .Text(label, x, y)
<FONT Color=gray>' ''Riempie il testo con il colore impostato (necessario per renderlo visibile):''</font>
      .Fill
     Next
     Next
    .Stroke
<FONT Color=gray>' ''Cambia colore pennello per disegnare il cerchio rosso:''</font>
     .Brush = Paint.Color(Color.Red)
     .Brush = Paint.Color(Color.Red)
<FONT Color=gray>' ''Imposta lo spessore della linea del cerchio:''</font>
     .LineWidth = 3.0
     .LineWidth = 3.0
     .Arc(DrawingArea1.W / 2 + 10, DrawingArea1.H / 2 - 6, rag, Rad(0), Rad(360), False)
<FONT Color=gray>' ''Disegna un arco completo (cerchio) con centro (cx, cy) e raggio 'rag'.''
' ''Angoli da 0 a 360 gradi (in radianti), non chiuso (False).''</font>
     .Arc(cx, cy, rag, Rad(0), Rad(360), False)
<FONT Color=gray>' ''Esegue il disegno della linea del cerchio:''</font>
     .Stroke
     .Stroke
    .End
   End With
   End With
    
End
Un altro codice possibile:
Private DrawingArea1 As DrawingArea
Public Sub Form_Open()
   With Me
    .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
    .Arrangement = Arrange.Fill
  End With
  With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
    .Background = Color.Lighter(Color.White)
  End With
End
Public Sub DrawingArea1_Draw()
<FONT Color=gray>' ''Centro orizzontale e verticale della DrawingArea:''</font>
  Dim cx, cy As Integer
<FONT Color=gray>' ''Raggio del goniometro con margine per non uscire dai bordi:''</font>
  Dim r As Integer
<FONT Color=gray>' ''Variabile per angolo in gradi:''</font>
  Dim a As Integer
<FONT Color=gray>' ''Coordinate per le tacche:''</font>
  Dim x1, y1, x2, y2 As Float
<FONT Color=gray>' ''Angolo in radianti, calcolato da gradi:''</font>
  Dim angleRad As Float
  cx = DrawingArea1.Width / 2              <FONT Color=gray>' ''Centro X''</font>
  cy = DrawingArea1.Height / 2            <FONT Color=gray>' ''Centro Y''</font>
  r = Min(cx, cy) - 40                    <FONT Color=gray>' ''Raggio con margine''</font>
  Paint.Arc(cx - r, cy - r, r * 2, r * 2, 0, 360)  <FONT Color=gray>' ''Disegna cerchio completo''</font>
  For a = 0 To 360 Step 10                <FONT Color=gray>' ''Ciclo da 0 a 360 gradi, step 10°''</font>
    angleRad = Rad(a)                      <FONT Color=gray>' ''Conversione gradi -> radianti''</font>
<FONT Color=gray>' ''Coordinate esterne della tacca (sulla circonferenza):''</font>
    x1 = cx + Cos(angleRad) * r
    y1 = cy + Sin(angleRad) * r
<FONT Color=gray>' ''Coordinate interne della tacca (più corta o più lunga):''</font>
    If a Mod 30 = 0 Then
      x2 = cx + Cos(angleRad) * (r - 20)  <FONT Color=gray>' ''Tacca lunga ogni 30°''</font>
      y2 = cy + Sin(angleRad) * (r - 20)
    Else
      x2 = cx + Cos(angleRad) * (r - 10)  <FONT Color=gray>' ''Tacca corta ogni 10°''</font>
      y2 = cy + Sin(angleRad) * (r - 10)
    EndIf
    Paint.MoveTo(x1, y1)                  <FONT Color=gray>' ''Inizio linea tacca''</font>
    Paint.LineTo(x2, y2)                  <FONT Color=gray>' ''Fine linea tacca''</font>
<FONT Color=gray>' ''Disegna numeri ogni 30°, escluso il 360 per non sovrapporre lo 0:''</font>
    If a Mod 30 = 0 And a <> 360 Then
      Dim tx, ty As Float
<FONT Color=gray>' ''Posizione testo leggermente più interno rispetto alla tacca lunga:''</font>
      tx = cx + Cos(angleRad) * (r - 35)
      ty = cy + Sin(angleRad) * (r - 35)
      Paint.Font.Size = 10
      Paint.Text(Str(a), tx - 10, ty - 6, 20, 12, Align.Center)  <FONT Color=gray>' ''Disegna numero angolo''</font>
    End If
  Next
<FONT Color=gray>' ''Linea orizzontale centrale (diametro):''</font>
  Paint.MoveTo(cx - r, cy)
  Paint.LineTo(cx + r, cy)
<FONT Color=gray>' ''Linea verticale centrale (diametro):''</font>
  Paint.MoveTo(cx, cy - r)
  Paint.LineTo(cx, cy + r)
<FONT Color=gray>' ''Applica il disegno''</font>
  Paint.Stroke()
  End
  End



Versione attuale delle 20:57, 27 lug 2025

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
   .Move(0, 0, Screen.AvailableWidth, 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()

' Raggio del cerchio su cui posizionare i numeri, pari al 40% dell'altezza dell'area di disegno:
 Dim rag As Short = DrawingArea1.H * 0.4

' Coordinate del centro del DrawingArea (centro del cerchio):
 Dim cx As Float = DrawingArea1.W / 2
 Dim cy As Float = DrawingArea1.H / 2
 Dim label As String        ' Variabile per contenere il testo (numero) da disegnare
 Dim an As Short            ' Variabile per l'angolo corrente in gradi
 Dim textW, textH As Float  ' Larghezza e altezza del testo da disegnare
 Dim correctionY As Float   ' Correzione verticale empirica per centrare visivamente il testo
 Dim x, y As Float          ' Coordinate di posizionamento del testo
 
 With Paint
' Imposta il colore del pennello per il testo:
   .Brush = Paint.Color(Color.Blue)

' Ciclo per disegnare i numeri da 0 a 350 gradi, con passo di 10 gradi:
   For an = 0 To FINEANGOLO - 10 Step 10
' Converte l'angolo corrente in stringa per disegnare il numero:
     label = CStr(an)

' Calcola la larghezza e l'altezza del testo (numero) usando il font corrente:
     textW = DrawingArea1.Font.TextWidth(label)
     textH = DrawingArea1.Font.TextHeight(label)

' Valore empirico per correggere l'offset verticale del testo, per farlo sembrare visivamente centrato:
     correctionY = textH * 0.35

' Calcola la coordinata X del punto sul cerchio dove posizionare il testo
' Coseno usato per partire da destra (0 gradi sull'asse X positivo)
' Sottrae metà larghezza testo per centrarlo orizzontalmente.
     x = cx + (rag + 20) * Cos(Rad(an)) - (textW / 2)

' Calcola la coordinata Y del punto sul cerchio dove posizionare il testo.
' Seno per posizione verticale lungo la circonferenza.
' Aggiunge la correzione verticale per un migliore allineamento visivo.
     y = cy + (rag + 20) * Sin(Rad(an)) + correctionY

' Disegna il testo (numero) nella posizione calcolata:
     .Text(label, x, y)

' Riempie il testo con il colore impostato (necessario per renderlo visibile):
     .Fill
   Next

' Cambia colore pennello per disegnare il cerchio rosso:
   .Brush = Paint.Color(Color.Red)

' Imposta lo spessore della linea del cerchio:
   .LineWidth = 3.0

' Disegna un arco completo (cerchio) con centro (cx, cy) e raggio 'rag'.
' Angoli da 0 a 360 gradi (in radianti), non chiuso (False).
   .Arc(cx, cy, rag, Rad(0), Rad(360), False)

' Esegue il disegno della linea del cerchio:
   .Stroke
 End With

End

Un altro codice possibile:

Private DrawingArea1 As DrawingArea


Public Sub Form_Open()

 With Me
   .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
   .Arrangement = Arrange.Fill
 End With

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Background = Color.Lighter(Color.White)
 End With

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
     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)

' Applica il disegno
 Paint.Stroke()

End


Note

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