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

Da Gambas-it.org - Wikipedia.
 
(18 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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 cerchio, disegnato in una ''DrawingArea''.
+
Mostriamo un possibile codice <SUP>&#091;[[#Note|nota 1]]&#093;</sup> per ottenere la rotazione <SPAN Style="text-decoration:underline">intorno al proprio asse centrale</span> di un cerchio, disegnato in una ''DrawingArea''. <SUP>&#091;[[#Note|<B>nota 2</b>]]&#093;</sup>
<BR>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.
+
<BR>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.
 
+
<BR>La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera oppure ruotando la rotellina del mouse.
  <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 Const DIAMETRO As Short = 200  <FONT Color=gray>' ''Memorizza il diametro del cerchio.''</font>
 +
Private fAngolo As Float                <FONT Color=gray>' ''Memorizza i gradi dell'angolo.''</font>
 +
Private c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
 +
Private f As Float[] = [0, 0.34, 0.67, 1]
 
   
 
   
Private x As Float        <FONT Color=gray>' ''Memorizza l'inizio del cerchio.''</font>
 
Private y As Float        <FONT Color=gray>' ''Idem''</font>
 
Private iAlt As Integer  <FONT Color=gray>' ''Memorizza l'altezza del cerchio.''</font>
 
Private iLarg As Integer  <FONT Color=gray>' ''Memorizza la larghezza del cerchio.''</font>
 
Private fAngolo As Float  <FONT Color=gray>' ''Memorizza i gradi dell'angolo.''</font>
 
Private fSopra1 As Float  <FONT Color=gray>' ''Memorizza la posizione di partenza orizzontale della rotazione.''</font>
 
Private fSopra2 As Float  <FONT Color=gray>' ''Memorizza la posizione di partenza verticale della rotazione.''</font>
 
Private fSotto1 As Float  <FONT Color=gray>' ''Memorizza la posizione di arrivo orizzontale della rotazione.''</font>
 
Private fSotto2 As Float  <FONT Color=gray>' ''Memorizza la posizione di arrivo verticale della rotazione.''</font>
 
 
   
 
   
 +
Public Sub Form_Open() 
 +
 
 +
  With Me
 +
    .W = DIAMETRO * 2
 +
    .H = .W
 +
    .Center
 +
    .Arrangement = Arrange.Fill
 +
  End With 
 
   
 
   
  '''Public''' Sub Form_Open()
+
  With da = New DrawingArea(Me) As "DrawingArea1"
 +
    .Background = Color.White
 +
  End With
 
    
 
    
  Me.Center   
+
End
 
 
  attivaDisegno()
 
 
    
 
    
'''End'''
 
 
   
 
   
 +
Public Sub DrawingArea1_Draw()
 
   
 
   
  '''Public''' Sub da_Draw()
+
  With Paint
 +
    .Arc(da.W / 2, da.H / 2, 2, Rad(0), Rad(360), False)
 +
    .Fill
 +
    .Brush = .LinearGradient(0, 20, 15, 0, c, f)
 +
<FONT Color=gray>' ''Imposta il fulcro/centro della rotazione - ad esempio -al centro dell'area di disegno:''</font>
 +
    <FONT Color=#B22222>.Translate</font>(da.W / 2, da.H / 2)
 +
    .Rotate(Rad(fAngolo)) 
 +
    .LineWidth = 2.0
 +
<FONT Color=gray>' ''Disegna il cerchio.''
 +
  ' ''Siccome l'angolo ruota su se stesso, si dà alle coordinate del cerchio la metà della dimensione del suo diametro.''
 +
' ''Non si devono modificare i valori né i segni dei primi quattro argomenti qui riportati.''</font>
 +
    .Ellipse(DIAMETRO / 2, DIAMETRO / 2, -DIAMETRO, -DIAMETRO, Rad(0), Rad(360), False)
 +
    .Stroke
 +
    .End
 +
  End With   
 +
   
 +
End
 +
 
 
   
 
   
  iLarg = 200
+
  Public Sub Form_KeyPress()
  iAlt = 200
+
    
<FONT Color=gray>' ''L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo;
+
  Select Case Key.Code
  ' ''e siccome l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo:''</font>
+
    Case Key.Up
  x = CFloat((da.W / 2) - (iLarg / 2))
+
      fAngolo += 1
   y = CFloat((da.H / 2) - (iAlt / 2))
+
      If fAngolo = 361 Then fAngolo = 1
                 
+
    Case Key.Down
<FONT Color=gray>' ''In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:''</font>
+
      fAngolo -= 1
  fSopra1 = CFloat((da.W / 2))
+
      If fAngolo = -361 Then fAngolo = -1
  fSopra2 = CFloat(da.H / 2)
+
  End Select
  fSotto1 = CFloat(- (da.W / 2))
+
 
  fSotto2 = CFloat(- (da.H / 2))
+
  da.Refresh
 
    
 
    
  With Paint
+
  End
    .Begin(da)
 
  <FONT Color=gray>' ''Vortice:''</font>
 
    .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 attivaDisegno()
+
  Public Sub Form_MouseWheel()
 
 
  da.Clear 
 
  da.Refresh
 
 
 
'''End'''
 
 
   
 
   
 +
  fAngolo += Mouse.Delta
 +
  Select Case fAngolo
 +
    Case 361
 +
      fAngolo = 1
 +
    Case -361
 +
      fAngolo = -1
 +
  End Select
 
   
 
   
'''Public''' Sub Form_KeyPress()
+
  da.Refresh
 
 
  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 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 disegno non va perso.''</font>
 
    
 
    
  attivaDisegno()
+
  da.Refresh
 
    
 
    
  '''End'''
+
  End
  
  
  
----
+
=Note=
=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'' .
 
[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 queste pagine:
 +
* [[Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
 +
* [[Ruotare una immagine sul proprio asse centrale]]

Versione attuale delle 04:55, 27 giu 2024

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 oppure ruotando la rotellina del mouse.

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

Private da As DrawingArea
Private Const DIAMETRO As Short = 200   ' Memorizza il diametro del cerchio.
Private fAngolo As Float                ' Memorizza i gradi dell'angolo.
Private c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
Private f As Float[] = [0, 0.34, 0.67, 1]


Public Sub Form_Open()  
 
 With Me
   .W = DIAMETRO * 2
   .H = .W
   .Center
   .Arrangement = Arrange.Fill
 End With  

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

Public Sub DrawingArea1_Draw()

 With Paint
   .Arc(da.W / 2, da.H / 2, 2, Rad(0), Rad(360), False)
   .Fill
   .Brush = .LinearGradient(0, 20, 15, 0, c, f)
' Imposta il fulcro/centro della rotazione - ad esempio -al centro dell'area di disegno:
   .Translate(da.W / 2, da.H / 2)
   .Rotate(Rad(fAngolo))   
   .LineWidth = 2.0
' Disegna il cerchio.
' Siccome l'angolo ruota su se stesso, si dà alle coordinate del cerchio la metà della dimensione del suo diametro.
' Non si devono modificare i valori né i segni dei primi quattro argomenti qui riportati.
   .Ellipse(DIAMETRO / 2, DIAMETRO / 2, -DIAMETRO, -DIAMETRO, Rad(0), Rad(360), False)
   .Stroke 
   .End
 End With     
    
End
 

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


Public Sub Form_MouseWheel()

 fAngolo += Mouse.Delta
 Select Case fAngolo
   Case 361
     fAngolo = 1
   Case -361
     fAngolo = -1
 End Select

 da.Refresh

End
 

Public Sub Form_Resize()   ' Con questo evento se cambia la dimensione del Form, il disegno 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 queste pagine: