Ruotare una immagine sul proprio asse centrale: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 69: Riga 69:
Se si intende ruotare l'immagine in senso orario, bisognerà porre valori ''negativi'' dei gradi: ''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 dimensioni 150x150 pixel sarà ruotata di 45° in senso antiorario:
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 im As Image
Private ang As Float
   
   
   
   
  '''Public''' Sub  Form_Open()
  '''Public''' Sub  Form_Open()
   
   
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
<FONT color=gray>' ''Rendiamo la "DrawingArea" delle medesime dimensioni dell'immagine caricata:''</font>
  With DrawingArea1
    .W = im.W
    .H = im.H
  End With
'''End'''
'''Public''' Sub DrawingArea1_Draw()
  Dim pb As PaintBrush
    
    
  With Paint
  With Me
<FONT color=gray>' ''Creiamo un oggetto "PaintBrush" mediante l'immagine caricata:''</font>
    .W = im.W * 3
    pb = Paint.Image(im)         
    .H = im.H * 2
    pb.Scale(DrawingArea1.W / im.W, DrawingArea1.H / im.H)
    .Center
    .Arrangement = Arrange.Fill
<FONT color=gray>' ''I valori associati ai parametri di questo metodo devono''
  End With  
' ''essere sempre pari alla metà della dimensione dell'immagine caricata:''</font>
    .Translate(im.W / 2, im.H / 2)
<FONT color=gray>' ''Ruotiamo l'immagine di 45° in senso antiorario:''</font>
    .<FONT Color=#B22222>Rotate(Rad(45))</font>
    .<FONT Color=#B22222>Translate</font>(-im.W / 2, -im.H / 2)
    .Brush = pb
    .Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
    .Fill
    .End
  End With
    
    
'''End'''
   With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
    .x = 0
 
     .Y = 0
In quest'altro esempio sarà possibile ruotare un'immagine mediante uno ''Slider'':
     .Background = Color.White
Private immago As Image
Private centrox As Float
Private centroy As Float
'''Public''' Sub Form_Open()
    
  Dim verticeX, verticeY As Float
 
  immago = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
<FONT Color=gray>' ''Centra l'immagine all'interno della DrawingArea:''</font>
  verticeX = (DrawingArea1.W - immago.W) / 2
  verticeY = (DrawingArea1.H - immago.H) / 2
 
<FONT Color=gray>' ''Individua il centro dell'immagine:''</font>
  centroX = verticeX + immago.W / 2
  centroY = verticeY + immago.H / 2
 
'''End'''
'''Public''' Sub DrawingArea1_Draw()
 
  Dim hBrush As PaintBrush
 
  With hBrush = Paint.Image(immago, centroX, centroY) 
     .Rotate(Rad(Slider1.Value))   
     .Translate(immago.W / 2, immago.H / 2)
   End With
   End With
  With Paint
    .Brush = hBrush 
    .Arc(centroX, centroY, immago.W / 2)
    .Fill
  End With
 
'''End'''
   
   
'''Public''' Sub Slider1_Change()
 
  DrawingArea1.Refresh
 
  '''End'''
  '''End'''
In quest'altro esempio si potrà ruotare l'immagine di 270° mediante uno ''Slider'' o mediante la rotellina del mouse oppure mediante il puntatore del mouse tenendo premuto un tasto:
Private im As Image
Private c As Short
'''Public''' Sub Form_Open()
  Me.Show
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
  With DrawingArea1
    .W = im.W
    .h = im.H
  End With
    
    
'''End'''
  '''Public''' Sub DrawingArea1_Draw()
  '''Public''' Sub DrawingArea1_Draw()
   
   
   Dim pb As PaintBrush
   Dim pb As PaintBrush
 
   With Paint
   With Paint
     pb = .Image(im)           
<FONT color=gray>' ''Creiamo un oggetto "PaintBrush" mediante l'immagine caricata:''</font>
    pb.Scale(DrawingArea1.W / im.W, DrawingArea1.H / im.H)
     pb = Paint.Image(im)           
     .Translate(im.W / 2, im.H / 2)
<FONT color=gray>' ''Il fulcro (vortice) della rotazione è sempre il centro dell'area di disegno:''</font>
     .Rotate(Rad(-1 * c))
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
     .Translate(- im.W / 2, - im.H / 2)
<FONT color=gray>' ''Ruota l'immagine:''</font>
    .Brush = pb
     .<FONT Color=#B22222>Rotate(Rad(ang))</font>
    .Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
<FONT color=gray>' ''Siccome l'angolo ruota su se stesso, si dà alle coordinate dell'immagine mezza dimensione negativa di se stessa:''</font>
    .Fill
     .DrawImage(im, -im.W / 2, -im.H / 2, -im.W, -im.H)
     .End
     .End
   End With
   End With
 
  '''End'''
  '''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
   
   
'''Public''' Sub Slider1_Change()
   DrawingArea1.Refresh
 
  c = Slider1.Value
   DrawingArea1.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 DrawingArea1_MouseWheel()
   
  c = c + (1 * Mouse.Delta)
    
    
  Slider1.Value = c
   DrawingArea1.Refresh
   DrawingArea1.Refresh()
    
    
'''End'''
'''Public''' Sub DrawingArea1_MouseMove()
  c = 270 - (Round(270 / im.H) * Mouse.Y)
 
  If c < 0 Then c = 0
  If c > 270 Then c = 270
  Slider1.Value = c
  DrawingArea1.Refresh()
  '''End'''
  '''End'''


Riga 231: Riga 137:
----
----
=Note=
=Note=
[1] Vedere anche questa pagina: [[Ruotare_qualsiasi_elemento_da_disegnare_in_una_DrawingArea|Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
[1] Vedere anche queste pagine:
* [[Ruotare_qualsiasi_elemento_da_disegnare_in_una_DrawingArea|Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
* [[Ruotare_un_cerchio_disegnato_in_una_DrawingArea|Ruotare un cerchio disegnato in una DrawingArea]]

Versione delle 21:06, 9 nov 2021

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 "Immagine", 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 = PictureBox1.Image.W
     .H = PictureBox1.Image.H
     .Image = .Image.Rotate(Rad(r))
   End With
   Wait 0.001
   Inc r
 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.004
    Next
  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()

 Dim pb As PaintBrush
 
 With Paint
' Creiamo un oggetto "PaintBrush" mediante l'immagine caricata:
   pb = Paint.Image(im)          
' Il fulcro (vortice) della rotazione è sempre il 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:
   .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 disegna non va perso
 
 DrawingArea1.Refresh
 
End



Note

[1] Vedere anche queste pagine: