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

Da Gambas-it.org - Wikipedia.
Riga 3: Riga 3:
 
<BR>La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.
 
<BR>La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.
  
  <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice.'''''</font>
+
  <FONT Color=gray>' '''''Il fulcro del Metodo ".Translate()" agisce da vortice, da centro di rotazione intorno a una ipotetica circonferenza'''''</font>
 
   
 
   
 +
Private da As DrawingArea
 
  Private x As Float        <FONT Color=gray>' ''Memorizza l'inizio del cerchio.''</font>
 
  Private x As Float        <FONT Color=gray>' ''Memorizza l'inizio del cerchio.''</font>
 
  Private y As Float        <FONT Color=gray>' ''Idem''</font>
 
  Private y As Float        <FONT Color=gray>' ''Idem''</font>
Riga 18: Riga 19:
 
  '''Public''' Sub Form_Open()   
 
  '''Public''' Sub Form_Open()   
 
    
 
    
   Me.Center  
+
   With Me
 
+
    .Center
   With da
+
    .Arrangement = Arrange.Fill
 +
  End With 
 +
 +
   With da = New DrawingArea(Me) As "da"
 
     .x = 0
 
     .x = 0
 
     .Y = 0
 
     .Y = 0
    .W = Me.W
 
    .H = Me.H
 
 
   End With
 
   End With
 
    
 
    
 
  '''End'''
 
  '''End'''
+
 
 
 
  '''Public''' Sub da_Draw()
 
  '''Public''' Sub da_Draw()
 
   
 
   
Riga 60: Riga 61:
 
      
 
      
 
  '''End'''
 
  '''End'''
+
 
 
 
  '''Public''' Sub Form_KeyPress()
 
  '''Public''' Sub Form_KeyPress()
 
    
 
    
Riga 76: Riga 76:
 
    
 
    
 
  '''End'''
 
  '''End'''
+
 
 
 
  '''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>
 
    
 
    

Versione delle 18:05, 9 nov 2021

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

' Il fulcro del Metodo ".Translate()" agisce da vortice, da centro di rotazione intorno a una ipotetica circonferenza

Private da As DrawingArea
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()  
 
 With Me
   .Center
   .Arrangement = Arrange.Fill
 End With  

 With da  = New DrawingArea(Me) As "da"
   .x = 0
   .Y = 0
 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)
   .LineWidth = 2.0
   .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



Note

[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 .

[2] Vedere anche questa pagina: Ruotare qualsiasi elemento da disegnare in una DrawingArea