Differenze tra le versioni di "Ruotare un arco in una DrawingArea"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
Per ottenere la rotazione <SPAN Style="text-decoration:underline">intorno al proprio asse centrale</span> di un arco di cerchio (il centro di rotazione è posto sulla corda dell'arco), disegnato in una ''DrawingArea'', potremo utilizzare il seguente codice:    [[#Nota|<SUP>Nota1</sup>]]
+
Mostriamo un possibile codice [[#Nota|<SUP>Nota1</sup>]] per ottenere la rotazione <SPAN Style="text-decoration:underline">intorno al proprio asse centrale</span> di un arco di cerchio (il centro di rotazione è posto sulla corda dell'arco), disegnato in una ''DrawingArea''.
 +
<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. l'arco ruoterà a seconda di dove esso si pone nel vortice.''''''</font>
+
  <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. (L'arco ruota a seconda di dove esso si pone nel vortice: in questo caso al centro).'''''</font>
 
   
 
   
 
  Private x As Float        <FONT Color=gray>' ''Memorizza l'inizio dell'arco.''</font>
 
  Private x As Float        <FONT Color=gray>' ''Memorizza l'inizio dell'arco.''</font>
Riga 27: Riga 28:
 
   iLarg = 200
 
   iLarg = 200
 
   iAlt = 200
 
   iAlt = 200
  <FONT Color=gray>' ''Se la rotazione è centrale, posiziona l'angolo al centro dell'area di disegno''
+
  <FONT Color=gray>' ''Posiziona l'angolo 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 l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo:''</font>
+
' ''e 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))
 
   x = CFloat((da.W / 2) - (iLarg / 2))
 
   y = CFloat((da.H / 2) - (iAlt / 2))
 
   y = CFloat((da.H / 2) - (iAlt / 2))
Riga 50: Riga 51:
 
      
 
      
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub attivaDisegno()
 
  '''Public''' Sub attivaDisegno()
 
+
 
 
   da.Clear   
 
   da.Clear   
 
   da.Refresh
 
   da.Refresh
 
+
 
 
  '''End'''
 
  '''End'''
 
   
 
   
 
   
 
   
  '''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
 
  If fAngolo = 405 Then fAngolo = 1
 
 
    
 
    
   attivaDisegno()
+
   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'''
 
  '''End'''
 
 
'''Public''' Sub btDestra_Click()
 
 
 
<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'''
 
 
 
   
 
   
 
  '''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>
Riga 96: Riga 86:
 
----
 
----
 
=Nota=
 
=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'' .
+
[1] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da analogo codice suggerito dal membro ''Gianluigi'' del forum di ''gambas-it.org'' .

Versione delle 18:44, 3 ott 2015

Mostriamo un possibile codice Nota1 per ottenere la rotazione intorno al proprio asse centrale di un arco di cerchio (il centro di rotazione è posto sulla corda dell'arco), disegnato in una DrawingArea.
La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.

' Il fulcro di Translate agisce da vortice. (L'arco ruota a seconda di dove esso si pone nel vortice: in questo caso al centro).

Private x As Float        ' Memorizza l'inizio dell'arco.
Private y As Float        ' Idem
Private iAlt As Integer   ' Memorizza l'altezza dell'arco.
Private iLarg As Integer  ' Memorizza la larghezza dell'arco.
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 l'angolo 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:
  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
    .Begin(da)
' Vortice:
    .Translate(fSopra1, fSopra2)    
    .Rotate(Rad(fAngolo))   
    .Translate(fSotto1, fSotto2)
    .Ellipse(x, y, iLarg, iAlt, Rad(180), Rad(180), True)
    .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] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da analogo codice suggerito dal membro Gianluigi del forum di gambas-it.org .