Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"

Da Gambas-it.org - Wikipedia.
 
Riga 4: Riga 4:
 
Innanzitutto si potrà utilizzare  una "PictureBox" e il solo Metodo ".Rotate()" della Classe "Image".
 
Innanzitutto si potrà utilizzare  una "PictureBox" e il solo Metodo ".Rotate()" della Classe "Image".
 
<BR>Va sottolineato che <SPAN Style="text-decoration:underline">la "PictureBox" deve avere la Proprietà ".Alignment" impostata ad "Align.Center"</span>.
 
<BR>Va sottolineato che <SPAN Style="text-decoration:underline">la "PictureBox" deve avere la Proprietà ".Alignment" impostata ad "Align.Center"</span>.
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
    
 
    
 
   Dim r As Short
 
   Dim r As Short
Riga 10: Riga 10:
 
   While True
 
   While True
 
     With PictureBox1
 
     With PictureBox1
       .Image = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
       .Image = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>")
 
       .<FONT Color=#B22222>Alignment = Align.Center</font>
 
       .<FONT Color=#B22222>Alignment = Align.Center</font>
 
       .W = .Image.W
 
       .W = .Image.W
Riga 21: Riga 21:
 
   Wend
 
   Wend
 
    
 
    
  '''End'''
+
  End
  
  
Riga 29: Riga 29:
  
 
Mostriamo un semplice e pratico esempio:
 
Mostriamo un semplice e pratico esempio:
  '''Public''' Sub Form_Activate()
+
  Public Sub Form_Activate()
 
    
 
    
 
   Dim im As Image
 
   Dim im As Image
Riga 36: Riga 36:
 
   Dim s As Short
 
   Dim s As Short
 
    
 
    
   im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
   im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>")
 
    
 
    
 
   With hs = New HSplit(Me)
 
   With hs = New HSplit(Me)
Riga 68: Riga 68:
 
   '''Loop'''</font>
 
   '''Loop'''</font>
 
    
 
    
  '''End'''
+
  End
 
Per effettuare la rotazione al contrario la riga del ciclo "For" sarà impostata come segue:
 
Per effettuare la rotazione al contrario la riga del ciclo "For" sarà impostata come segue:
 
  For s = 0 To -360 Step -1
 
  For s = 0 To -360 Step -1
Riga 86: Riga 86:
 
   
 
   
 
   
 
   
  '''Public''' Sub  Form_Open()
+
  Public Sub  Form_Open()
 
   
 
   
   im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
   im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>")
 
    
 
    
 
   With Me
 
   With Me
Riga 103: Riga 103:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
 
    
 
    
  '''Public''' Sub DrawingArea1_Draw()
+
   
 +
Public Sub DrawingArea1_Draw()
 
    
 
    
 
   With Paint
 
   With Paint
 
  <FONT Color=gray>' ''Imposta il fulcro/punto della rotazione - ad esempio -al centro dell'area di disegno:''</font>
 
  <FONT Color=gray>' ''Imposta il fulcro/punto della rotazione - ad esempio -al centro dell'area di disegno:''</font>
     <FONT Color=#B22222>.Translate</font>(DrawingArea1.W / 2, DrawingArea1.H / 2)
+
     <FONT Color=red>.Translate</font>(DrawingArea1.W / 2, DrawingArea1.H / 2)
 
  <FONT color=gray>' ''Ruota l'immagine:''</font>
 
  <FONT color=gray>' ''Ruota l'immagine:''</font>
     <FONT Color=#B22222>.Rotate(Rad(ang))</font>
+
     <FONT Color=red>.Rotate(Rad(ang))</font>
 
  <FONT color=gray>' ''Siccome l'angolo ruota su se stesso, si dà alle coordinate dell'immagine mezza dimensione negativa di se stessa.''
 
  <FONT color=gray>' ''Siccome l'angolo ruota su se stesso, si dà alle coordinate dell'immagine mezza dimensione negativa di se stessa.''
 
  ' ''Non si devono modificare i valori né i segni degli ultimi quattro argomenti qui riportati.''</font>
 
  ' ''Non si devono modificare i valori né i segni degli ultimi quattro argomenti qui riportati.''</font>
Riga 118: Riga 119:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Form_KeyPress()
+
  Public Sub Form_KeyPress()
 
    
 
    
 
   Select Case Key.Code
 
   Select Case Key.Code
Riga 133: Riga 135:
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Form_Resize()  <FONT color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegno 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>
 
    
 
    
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
    
 
    
  '''End'''
+
  End
 +
 
  
  
----
 
 
=Note=
 
=Note=
 
[1] Vedere anche queste pagine:
 
[1] Vedere anche queste pagine:
 
* [[Ruotare un'immagine sul proprio asse centrale in una DrawingArea]]
 
* [[Ruotare un'immagine sul proprio asse centrale in una DrawingArea]]
 
* [[Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
 
* [[Ruotare qualsiasi elemento da disegnare in una DrawingArea]]

Versione attuale delle 14:33, 3 lug 2024

Per ruotare un'immagine rigorosamente intorno al proprio asse centrale (isometria diretta), mantenendo in modo costante e coerente la sua distanza dal Controllo che contiene l'Oggetto "Image", possiamo adottare alcune modalità.

Uso del Metodo ".Rotate()" della Classe Image

Innanzitutto si potrà utilizzare una "PictureBox" e il solo Metodo ".Rotate()" della Classe "Image".
Va sottolineato che la "PictureBox" deve avere la Proprietà ".Alignment" impostata ad "Align.Center".

Public Sub Button1_Click()
 
 Dim r As Short
 
 While True
   With PictureBox1
     .Image = Image.Load("/percorso/del/file/immagine")
     .Alignment = Align.Center
     .W = .Image.W
     .H = .Image.H
     .Image = .Image.Rotate(Rad(r))
   End With
   Wait 0.01
   Inc r
   If r == 360 Then r = 0
 Wend
 
End


Uso di una PictureBox e di un Contenitore HSplit

Un'altra modalità prevede ancora l'uso di una PictureBox e del Contenitore HSplit.
Anche in questo caso la PictureBox deve avere la Proprietà ".Alignment" impostata ad "Align.Center".

Mostriamo un semplice e pratico esempio:

Public Sub Form_Activate()
 
 Dim im As Image
 Dim hs As HSplit
 Dim pbx As PictureBox
 Dim s As Short
 
 im = Image.Load("/percorso/del/file/immagine")
 
 With hs = New HSplit(Me)
   .X = 20
   .Y = 20
   .W = im.W
   .H = im.H
 End With
 
 With pbx = New PictureBox(hs)
   .Alignment = Align.Center
   .Expand = True
   .Image = im
 End With
  
 Do
   For s = 0 To 360
     pbx.Image = im.Rotate(Rad(s))
     Wait 0.01
   Next
 Loop

' Oppure con due cicli annidati:
 Do
   Repeat
     pbx.Image = im.Rotate(Rad(s))
     Wait 0.01
     Inc s          oppure: Dec s
   Until s == 360   oppure: -360
   s = 0
 Loop
  
End

Per effettuare la rotazione al contrario la riga del ciclo "For" sarà impostata come segue:

For s = 0 To -360 Step -1


Uso di una DrawingArea e dei Metodi ".Rotate()" e ".Translate()" della Classe "Paint"

Un'altra modalità prevede l'uso di una DrawingArea e dei Metodi ".Rotate()" e ".Translate()" della Classe "Paint". [nota 1]

La rotazione dell'immagine viene esercitata dal metodo

Paint.Rotate(Rad(valore_in_gradi))

Se si intende ruotare l'immagine in senso orario, bisognerà porre valori negativi dei gradi: Paint.Rotate(Rad(-valore_in_gradi)).

Nel seguente esempio pratico, una immagine di uguali dimensioni sarà ruotata verso destra o verso sinistra premendo i tasti della tastiera "freccia in su" e "freccia in giù":

Private DrawingArea1 As DrawingArea
Private im As Image
Private ang As Float


Public Sub  Form_Open()

 im = Image.Load("/percorso/del/file/immagine")
 
 With Me
   .W = im.W * 3
   .H = im.H * 2
   .Center
   .Arrangement = Arrange.Fill
 End With 
 
 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .x = 0
   .Y = 0
   .Background = Color.White
 End With

End
 

Public Sub DrawingArea1_Draw()
 
 With Paint
' Imposta il fulcro/punto della rotazione - ad esempio -al centro dell'area di disegno:
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
' Ruota l'immagine:
   .Rotate(Rad(ang))
' Siccome l'angolo ruota su se stesso, si dà alle coordinate dell'immagine mezza dimensione negativa di se stessa.
' Non si devono modificare i valori né i segni degli ultimi quattro argomenti qui riportati.
   .DrawImage(im, -im.W / 2, -im.H / 2, -im.W, -im.H)
   .End
 End With
 
End


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

 DrawingArea1.Refresh
 
End


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


Note

[1] Vedere anche queste pagine: