Differenze tra le versioni di "Ruotare un quadrato ed un rettangolo in una DrawingArea"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Nella presente pagina vedremo come far ruotare su se stessi, ossia <SPAN Style="text-decoration:underline">intorno al proprio asse centrale</span>, un quadrato ed un rettangolo disegnati su una ''DrawingArea''. [[#Nota|<SUP>Nota1</sup>]]
+
Mostriamo due analoghi possibili codici [[#Nota|<SUP>Nota1</sup>]] per far ruotare su se stessi, ossia <SPAN Style="text-decoration:underline">intorno al proprio asse centrale</span>, un quadrato ed un rettangolo disegnati su una ''DrawingArea''.
 +
<BR>In entrambi gli esempi la rotazione del quadrato e del rettangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.
  
  
 
==Ruotare un quadrato sul proprio asse centrale==
 
==Ruotare un quadrato sul proprio asse centrale==
 
Per ottenere la rotazione sul proprio asse centrale di un quadrato disegnato in una ''DrawingArea'' è possibile adottare il seguente codice:
 
Per ottenere la rotazione sul proprio asse centrale di un quadrato disegnato in una ''DrawingArea'' è possibile adottare il seguente codice:
  <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. Il quadrato ruoterà a seconda di dove esso si pone nel vortice.'''''</font>
+
  <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. (Il quadrato ruoterà a seconda di dove esso si pone nel vortice: in questo esempio al centro.)'''''</font>
 
   
 
   
 
  Private fRaggio As Float  <FONT Color=gray>' ''Memorizza la lunghezza del raggio del cerchio.''</font>
 
  Private fRaggio As Float  <FONT Color=gray>' ''Memorizza la lunghezza del raggio del cerchio.''</font>
Riga 33: Riga 34:
 
   iLarg = 200
 
   iLarg = 200
 
   iAlt = 200
 
   iAlt = 200
  <FONT Color=gray>' ''Se la rotazione è centrale, posiziona il quadrato al centro dell'area di disegno''
+
  <FONT Color=gray>' ''Posiziona il quadrato al centro dell'area di disegno, così come le misure di partenza e di arrivo;''
' ''così come le misure di partenza e di arrivo; e siccome il quadrato ruota su se stesso, si dà al raggio del cerchio mezza lunghezza del quadrato:''</font>
+
' ''e siccome il quadrato ruota su se stesso, si dà al raggio del cerchio mezza lunghezza del quadrato:''</font>
 
   x = CFloat((da.W / 2) - (iLarg / 2))
 
   x = CFloat((da.W / 2) - (iLarg / 2))
 
   y = CFloat((da.H / 2) - (iAlt / 2))
 
   y = CFloat((da.H / 2) - (iAlt / 2))
Riga 70: Riga 71:
 
   
 
   
 
   
 
   
  '''Public''' Sub btSinistra_Click()
+
  '''Public''' Sub Form_KeyPress()
 
 
<FONT Color=gray>' ''Ogni volta che si agisce sul tasto incrementa il valore di un grado:''
 
' '''''(positivo = senso antiorario)'''''</font>
 
 
    
 
    
   fAngolo += 1
+
   Select Case Key.Code
  If fAngolo = 405 Then fAngolo = 1
+
    Case Key.Up
 
+
      fAngolo += 1
  attivaDisegno()
+
      If fAngolo = 361 Then fAngolo = 1
 
+
      attivaDisegno()
'''End'''
+
    Case Key.Down
+
      fAngolo -= 1
+
      If fAngolo = -361 Then fAngolo = -1
'''Public''' Sub btDestra_Click()
+
      attivaDisegno()
 
+
  End Select
<FONT Color=gray>' ''Ogni volta che si agisce sul tasto decrementa il valore di un grado:''
 
' '''''(negativo = senso orario)'''''</font>
 
 
 
  fAngolo -= 1
 
  If fAngolo = -405 Then fAngolo = -1
 
 
 
  attivaDisegno()
 
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 106: Riga 97:
 
==Ruotare un rettangolo sul proprio asse centrale==
 
==Ruotare un rettangolo sul proprio asse centrale==
 
Per ottenere la rotazione sul proprio asse centrale di un rettangolo disegnato in una ''DrawingArea'' è possibile adottare il seguente codice analogo al precedente:
 
Per ottenere la rotazione sul proprio asse centrale di un rettangolo disegnato in una ''DrawingArea'' è possibile adottare il seguente codice analogo al precedente:
  <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. Il rettangolo ruoterà a seconda di dove esso si pone nel vortice.''''''</font>
+
  <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. (Il rettangolo ruoterà a seconda di dove esso si pone nel vortice: in questo esempio al centro.)'''''</font>
 
   
 
   
 
  Private fRaggio As Float  <FONT Color=gray>' ''Memorizza la lunghezza del raggio del cerchio.''</font>
 
  Private fRaggio As Float  <FONT Color=gray>' ''Memorizza la lunghezza del raggio del cerchio.''</font>
Riga 172: Riga 163:
 
   
 
   
 
   
 
   
  '''Public''' Sub btSinistra_Click()
+
  '''Public''' Sub Form_KeyPress()
 
 
<FONT Color=gray>' ''Ogni volta che si agisce sul tasto incrementa il valore di un grado:''
 
' '''''(positivo = senso antiorario)'''''</font>
 
 
    
 
    
   fAngolo += 1
+
   Select Case Key.Code
  If fAngolo = 405 Then fAngolo = 1
+
    Case Key.Up
 
+
      fAngolo += 1
  attivaDisegno()
+
      If fAngolo = 361 Then fAngolo = 1
 
+
      attivaDisegno()
'''End'''
+
    Case Key.Down
+
      fAngolo -= 1
+
      If fAngolo = -361 Then fAngolo = -1
'''Public''' Sub btDestra_Click()
+
      attivaDisegno()
 
+
  End Select
<FONT Color=gray>' ''Ogni volta che si agisce sul tasto decrementa il valore di un grado:''
 
' '''''(negativo = senso orario)'''''</font>
 
 
 
  fAngolo -= 1
 
  If fAngolo = -405 Then fAngolo = -1
 
 
 
  attivaDisegno()
 
 
    
 
    
 
  '''End'''
 
  '''End'''

Versione delle 19:55, 3 ott 2015

Mostriamo due analoghi possibili codici Nota1 per far ruotare su se stessi, ossia intorno al proprio asse centrale, un quadrato ed un rettangolo disegnati su una DrawingArea.
In entrambi gli esempi la rotazione del quadrato e del rettangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.


Ruotare un quadrato sul proprio asse centrale

Per ottenere la rotazione sul proprio asse centrale di un quadrato disegnato in una DrawingArea è possibile adottare il seguente codice:

' Il fulcro di Translate agisce da vortice. (Il quadrato ruoterà a seconda di dove esso si pone nel vortice: in questo esempio al centro.)

Private fRaggio As Float  ' Memorizza la lunghezza del raggio del cerchio.
Private xArc As Float     ' Memorizza il centro del cerchio.
Private yArc As Float     ' Idem
Private x As Float        ' Memorizza l'inizio del quadrato.
Private y As Float        ' Idem
Private iAlt As Integer   ' Memorizza l'altezza del quadrato.
Private iLarg As Integer  ' Memorizza la larghezza del quadrato.
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    
  
  attivaDisegno()
 
End


Public Sub da_Draw()

  iLarg = 200
  iAlt = 200
' Posiziona il quadrato al centro dell'area di disegno, così come le misure di partenza e di arrivo;
' e siccome il quadrato ruota su se stesso, si dà al raggio del cerchio mezza lunghezza del quadrato:
  x = CFloat((da.W / 2) - (iLarg / 2))
  y = CFloat((da.H / 2) - (iAlt / 2))
  fRaggio = CFloat(iLarg / 2)
              
' In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:
  xArc = CFloat((da.W / 2))
  yArc = CFloat(da.H / 2) 
  fSopra1 = CFloat((da.W / 2))
  fSopra2 = CFloat(da.H / 2) 
  fSotto1 = CFloat(- (da.W / 2))
  fSotto2 = CFloat(- (da.H / 2))
  
  With Paint
    .Begin(da)
' Vortice:
    .Translate(fSopra1, fSopra2)    
    .Rotate(Rad(fAngolo))   
    .Translate(fSotto1, fSotto2)
    .Rectangle(x, y, iLarg, iAlt)
    .Arc(xArc, yArc, fRaggio)
    .Stroke 
    .End
  End With     
    
End


Public Sub attivaDisegno()
  
  da.Clear  
  da.Refresh
  
End


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


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


Ruotare un rettangolo sul proprio asse centrale

Per ottenere la rotazione sul proprio asse centrale di un rettangolo disegnato in una DrawingArea è possibile adottare il seguente codice analogo al precedente:

' Il fulcro di Translate agisce da vortice. (Il rettangolo ruoterà a seconda di dove esso si pone nel vortice: in questo esempio al centro.)

Private fRaggio As Float  ' Memorizza la lunghezza del raggio del cerchio.
Private xArc As Float     ' Memorizza il centro del cerchio.
Private yArc As Float     ' Idem
Private x As Float        ' Memorizza l'inizio del rettangolo.
Private y As Float        ' Idem
Private iAlt As Integer   ' Memorizza l'altezza del rettangolo.
Private iLarg As Integer  ' Memorizza la larghezza del rettangolo.
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    
  
  attivaDisegno()
 
End


Public Sub da_Draw()

  iLarg = 200
  iAlt = 150
' Se la rotazione è centrale, posiziona il rettangolo al centro dell'area di disegno
' così come le misure di partenza e di arrivo; e siccome il rettangolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza del rettangolo:
  x = CFloat((da.W / 2) - (iLarg / 2))
  y = CFloat((da.H / 2) - (iAlt / 2))
  fRaggio = CFloat(iLarg / 2)
              
' In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:
  xArc = CFloat((da.W / 2))
  yArc = CFloat(da.H / 2) 
  fSopra1 = CFloat((da.W / 2))
  fSopra2 = CFloat(da.H / 2) 
  fSotto1 = CFloat(- (da.W / 2))
  fSotto2 = CFloat(- (da.H / 2))
  
  With Paint
    .Begin(da)
' Vortice:
    .Translate(fSopra1, fSopra2)    
    .Rotate(Rad(fAngolo))   
    .Translate(fSotto1, fSotto2)
    .Rectangle(x, y, iLarg, iAlt)
    .Arc(xArc, yArc, fRaggio)
    .Stroke 
    .End
  End With     
    
End


Public Sub attivaDisegno()
  
  da.Clear  
  da.Refresh
  
End


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


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



Nota

[1] I codici, presenti in questa pagina, sono tratti - con modifiche ed integrazioni - da suggerimenti del membro Gianluigi del forum di gambas-it.org e del membro Shell del forum gambas-es.org .