Differenze tra le versioni di "Ruotare un cerchio disegnato in una DrawingArea"

Da Gambas-it.org - Wikipedia.
Riga 17: Riga 17:
 
  '''Public''' Sub Form_Open()   
 
  '''Public''' Sub Form_Open()   
 
    
 
    
  Me.Center     
+
  Me.Center     
 
    
 
    
  attivaDisegno()
+
  With da
 +
    .x = 0
 +
    .Y = 0
 +
    .W = Me.W
 +
    .H = Me.H
 +
  End With
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 26: Riga 31:
 
  '''Public''' Sub da_Draw()
 
  '''Public''' Sub da_Draw()
 
   
 
   
  iLarg = 200
+
  Dim c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
  iAlt = 200
+
  Dim f As Float[] = [0, 0.34, 0.67, 1]
  <FONT Color=gray>' ''L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo;
+
 
' ''e siccome l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo:''</font>
+
  iLarg = 200
  x = CFloat((da.W / 2) - (iLarg / 2))
+
  iAlt = 200
  y = CFloat((da.H / 2) - (iAlt / 2))
+
  <FONT Color=gray>' ''L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo. Siccome l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo.''</font>
 +
  x = CFloat((da.W / 2) - (iLarg / 2))
 +
  y = CFloat((da.H / 2) - (iAlt / 2))
 
                    
 
                    
 
  <FONT Color=gray>' ''In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:''</font>
 
  <FONT Color=gray>' ''In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:''</font>
  fSopra1 = CFloat((da.W / 2))
+
  fSopra1 = CFloat((da.W / 2))
  fSopra2 = CFloat(da.H / 2)  
+
  fSopra2 = CFloat(da.H / 2)  
  fSotto1 = CFloat(- (da.W / 2))
+
  fSotto1 = CFloat(- (da.W / 2))
  fSotto2 = CFloat(- (da.H / 2))
+
  fSotto2 = CFloat(- (da.H / 2))
 
    
 
    
  With Paint
+
  With Paint
    .Begin(da)
+
    .Brush = .LinearGradient(0, 20, 15, 0, c, f)
 
  <FONT Color=gray>' ''Vortice:''</font>
 
  <FONT Color=gray>' ''Vortice:''</font>
    .Translate(fSopra1, fSopra2)     
+
    .Translate(fSopra1, fSopra2)     
    .Rotate(Rad(fAngolo))   
+
    .Rotate(Rad(fAngolo))   
    .Translate(fSotto1, fSotto2)
+
    .Translate(fSotto1, fSotto2)
    .Ellipse(x, y, iLarg, iAlt, Rad(360), Rad(360), True)
+
    .Ellipse(x, y, iLarg, iAlt, Rad(360), Rad(360), True)
    .Stroke  
+
    .Stroke  
    .End
+
    .End
  End With     
+
  End With     
 
      
 
      
'''End'''
 
 
 
'''Public''' Sub attivaDisegno()
 
 
 
  da.Clear 
 
  da.Refresh
 
 
 
 
  '''End'''
 
  '''End'''
 
   
 
   
Riga 63: Riga 62:
 
  '''Public''' Sub Form_KeyPress()
 
  '''Public''' Sub Form_KeyPress()
 
    
 
    
  Select Case Key.Code
+
  Select Case Key.Code
    Case Key.Up
+
    Case Key.Up
      fAngolo += 1
+
      fAngolo += 1
      If fAngolo = 361 Then fAngolo = 1
+
      If fAngolo = 361 Then fAngolo = 1
      attivaDisegno()
+
      da.Refresh
    Case Key.Down
+
    Case Key.Down
      fAngolo -= 1
+
      fAngolo -= 1
      If fAngolo = -361 Then fAngolo = -1
+
      If fAngolo = -361 Then fAngolo = -1
      attivaDisegno()
+
      da.Refresh
  End Select
+
  End Select
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 79: Riga 78:
 
  '''Public''' Sub Form_Resize()  <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegna non va perso.''</font>
 
  '''Public''' Sub Form_Resize()  <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegna non va perso.''</font>
 
    
 
    
  attivaDisegno()
+
  da.Refresh
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  

Versione delle 19:43, 2 giu 2021

Mostriamo un possibile codice Nota1 per ottenere la rotazione intorno al proprio asse centrale di un cerchio, disegnato in una DrawingArea.
Nell'esempio la rotazione del cerchio potrà essere notata attraverso visualizzazione della rotazione del suo raggio. La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.

' Il fulcro di Translate agisce da vortice.

Private x As Float        ' Memorizza l'inizio del cerchio.
Private y As Float        ' Idem
Private iAlt As Integer   ' Memorizza l'altezza del cerchio.
Private iLarg As Integer  ' Memorizza la larghezza del cerchio.
Private fAngolo As Float  ' Memorizza i gradi dell'angolo.
Private fSopra1 As Float  ' Memorizza la posizione di partenza orizzontale della rotazione.
Private fSopra2 As Float  ' Memorizza la posizione di partenza verticale della rotazione.
Private fSotto1 As Float  ' Memorizza la posizione di arrivo orizzontale della rotazione.
Private fSotto2 As Float  ' Memorizza la posizione di arrivo verticale della rotazione.


Public Sub Form_Open()  
 
 Me.Center    
  
 With da
   .x = 0
   .Y = 0
   .W = Me.W
   .H = Me.H
 End With
 
End


Public Sub da_Draw()

 Dim c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
 Dim f As Float[] = [0, 0.34, 0.67, 1]
 
 iLarg = 200
 iAlt = 200
' L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo. Siccome l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo.
 x = CFloat((da.W / 2) - (iLarg / 2))
 y = CFloat((da.H / 2) - (iAlt / 2))
                 
' In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:
 fSopra1 = CFloat((da.W / 2))
 fSopra2 = CFloat(da.H / 2) 
 fSotto1 = CFloat(- (da.W / 2))
 fSotto2 = CFloat(- (da.H / 2))
  
 With Paint
   .Brush = .LinearGradient(0, 20, 15, 0, c, f)
' Vortice:
   .Translate(fSopra1, fSopra2)    
   .Rotate(Rad(fAngolo))   
   .Translate(fSotto1, fSotto2)
   .Ellipse(x, y, iLarg, iAlt, Rad(360), Rad(360), True)
   .Stroke 
   .End
 End With     
    
End


Public Sub Form_KeyPress()
  
 Select Case Key.Code
   Case Key.Up
     fAngolo += 1
     If fAngolo = 361 Then fAngolo = 1
     da.Refresh
   Case Key.Down
     fAngolo -= 1
     If fAngolo = -361 Then fAngolo = -1
     da.Refresh
 End Select
  
End


Public Sub Form_Resize()   ' Con questo evento se cambia la dimensione del Form, il disegna non va perso.
  
 da.Refresh
  
End



Nota

[1] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da un analogo codice suggerito dal membro Gianluigi del forum di gambas-it.org .