Ruotare un arco in una DrawingArea: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
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 arco di cerchio (il centro di rotazione è posto sulla corda dell'arco), disegnato in una ''DrawingArea''. <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
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 arco, disegnato in una ''DrawingArea''. <SUP>&#091;[[#Note|<B>Nota 2</b>]]&#093;</sup>
<BR>La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.  
<BR>Nell'esempio la rotazione dell'arco 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.
  <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>
  <FONT Color=gray>' '''''Il fulcro del Metodo ".Translate()" agisce da vortice, da centro di rotazione intorno a una ipotetica circonferenza'''''</font>
   
   
  Private x As Float        <FONT Color=gray>' ''Memorizza l'inizio dell'arco.''</font>
  Private da As DrawingArea
  Private y As Float        <FONT Color=gray>' ''Idem''</font>
  Private Const DIAMETRO As Short = 200   <FONT Color=gray>' ''Memorizza il diametro dell'arco.''</font>
Private iAlt As Integer   <FONT Color=gray>' ''Memorizza l'altezza dell'arco.''</font>
  Private fAngolo As Float               <FONT Color=gray>' ''Memorizza i gradi dell'angolo.''</font>
Private iLarg As Integer  <FONT Color=gray>' ''Memorizza la larghezza dell'arco.''</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()   
  '''Public''' Sub Form_Open()   
    
    
  Me.Center  
  With Me
 
    .W = DIAMETRO * 2
  attivaDisegno()
    .H = .W
    .Center
    .Arrangement = Arrange.Fill
  End With 
  With da  = New DrawingArea(Me) As "da"
    .x = 0
    .Y = 0
    .Background = Color.White
  End With
    
    
  '''End'''
  '''End'''
 
  '''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>' ''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:''</font>
  With Paint
  x = CFloat((da.W / 2) - (iLarg / 2))
    .Brush = .LinearGradient(0, 20, 15, 0, c, f)
  y = CFloat((da.H / 2) - (iAlt / 2))
  <FONT Color=gray>' ''Il fulcro (vortice) della rotazione è sempre il centro dell'area di disegno:''</font>
                 
    <FONT Color=#B22222>.Translate</font>(da.W / 2, da.H / 2)
  <FONT Color=gray>' ''In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:''</font>
    .Rotate(Rad(fAngolo))  
  fSopra1 = CFloat((da.W / 2))
    .LineWidth = 2.0
  fSopra2 = CFloat(da.H / 2)  
  <FONT Color=gray>' ''Disegna l'arco.''
  fSotto1 = CFloat(- (da.W / 2))
' ''Siccome l'angolo ruota su se stesso, si dà alle coordinate dell'arco la metà della dimensione del suo diametro:''</font>
  fSotto2 = CFloat(- (da.H / 2))
    .Ellipse(DIAMETRO / 2, DIAMETRO / 2, -DIAMETRO, -DIAMETRO, Rad(180), Rad(180), True)
 
    .Stroke  
  With Paint
    .End
  <FONT Color=gray>' ''Vortice:''</font>
  End With     
    .Translate(fSopra1, fSopra2)   
    .Rotate(Rad(fAngolo)) 
    .Translate(fSotto1, fSotto2)
    .Ellipse(x, y, iLarg, iAlt, Rad(180), Rad(180), True)
    .Stroke  
    .End
  End With     
      
      
  '''End'''
  '''End'''
'''Public''' Sub attivaDisegno()
 
  da.Clear 
  da.Refresh
    
    
'''End'''
  '''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()
    Case Key.Down
    Case Key.Down
      fAngolo -= 1
      fAngolo -= 1
      If fAngolo = -361 Then fAngolo = -1
      If fAngolo = -361 Then fAngolo = -1
  End Select
      attivaDisegno()
 
  End Select
  da.Refresh
    
    
  '''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>
    
    
  attivaDisegno()
  da.Refresh
    
    
  '''End'''
  '''End'''
Riga 86: Riga 71:
----
----
=Note=
=Note=
[1] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da analogo codice suggerito dal membro ''Gianluigi'' del forum di ''www.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 questa pagina: [[Ruotare_qualsiasi_elemento_da_disegnare_in_una_DrawingArea|Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
[2] Vedere anche queste pagine:
* [[Ruotare_un_cerchio_disegnato_in_una_DrawingArea|Ruotare un cerchio disegnato in una DrawingArea]]
* [[Ruotare_qualsiasi_elemento_da_disegnare_in_una_DrawingArea|Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
* [[Ruotare_una_immagine_sul_proprio_asse_centrale|Ruotare una immagine sul proprio asse centrale]]

Versione delle 21:24, 9 nov 2021

Mostriamo un possibile codice [Nota 1] per ottenere la rotazione intorno al proprio asse centrale di un arco, disegnato in una DrawingArea. [Nota 2]
Nell'esempio la rotazione dell'arco 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 Const DIAMETRO As Short = 200   ' Memorizza il diametro dell'arco.
Private fAngolo As Float                ' Memorizza i gradi dell'angolo.


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

 With da  = New DrawingArea(Me) As "da"
   .x = 0
   .Y = 0
   .Background = Color.White
 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]
 
 With Paint
   .Brush = .LinearGradient(0, 20, 15, 0, c, f)
' Il fulcro (vortice) della rotazione è sempre il centro dell'area di disegno:
   .Translate(da.W / 2, da.H / 2)
   .Rotate(Rad(fAngolo))   
   .LineWidth = 2.0
' Disegna l'arco.
' Siccome l'angolo ruota su se stesso, si dà alle coordinate dell'arco la metà della dimensione del suo diametro:
   .Ellipse(DIAMETRO / 2, DIAMETRO / 2, -DIAMETRO, -DIAMETRO, Rad(180), Rad(180), 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
   Case Key.Down
     fAngolo -= 1
     If fAngolo = -361 Then fAngolo = -1
 End Select
 
 da.Refresh
  
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 queste pagine: