Ruotare una immagine sul proprio asse centrale: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 61: | Riga 61: | ||
==Uso di una ''DrawingArea'' e | ==Uso di una ''DrawingArea'' e dei Metodi ".Rotate()" e ".Translate()" della Classe "Paint"== | ||
Un'altra modalità prevede l'uso di una ''DrawingArea'' e | Un'altra modalità prevede l'uso di una ''DrawingArea'' e dei Metodi ".Rotate()" e ".Translate()" della Classe "Paint". <SUP>[[[#Note|Nota 1]]]</sup> | ||
La rotazione dell'immagine viene esercitata dal metodo | La rotazione dell'immagine viene esercitata dal metodo | ||
''Paint.Rotate(Rad(valore_in_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))''. | 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 dimensioni 150x150 pixel sarà ruotata di 45° in senso antiorario: | ||
| Riga 119: | Riga 118: | ||
Dim verticeX, verticeY As Float | Dim verticeX, verticeY As Float | ||
immago = Image.Load("<FONT Color=gray> | immago = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | ||
<FONT Color=gray>' ''Centra l'immagine all'interno della DrawingArea:''</font> | <FONT Color=gray>' ''Centra l'immagine all'interno della DrawingArea:''</font> | ||
| Riga 229: | Riga 228: | ||
---- | |||
=Note= | =Note= | ||
[1] | [1] Vedere anche questa pagina: [[Ruotare_qualsiasi_elemento_da_disegnare_in_una_DrawingArea|Ruotare qualsiasi elemento da disegnare in una DrawingArea]] | ||
Versione delle 15:58, 15 ott 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 dimensioni 150x150 pixel sarà ruotata di 45° in senso antiorario:
Private im As Image
Public Sub Form_Open()
im = Image.Load("/percorso/del/file/immagine")
' Rendiamo la "DrawingArea" delle medesime dimensioni dell'immagine caricata:
With DrawingArea1
.W = im.W
.H = im.H
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)
pb.Scale(DrawingArea1.W / im.W, DrawingArea1.H / im.H)
' I valori associati ai parametri di questo metodo devono
' essere sempre pari alla metà della dimensione dell'immagine caricata:
.Translate(im.W / 2, im.H / 2)
' Ruotiamo l'immagine di 45° in senso antiorario:
.Rotate(Rad(45))
.Translate(-im.W / 2, -im.H / 2)
.Brush = pb
.Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
.Fill
.End
End With
End
In quest'altro esempio sarà possibile ruotare un'immagine mediante uno Slider:
Private immago As Image
Private centrox As Float
Private centroy As Float
Public Sub Form_Open()
Dim verticeX, verticeY As Float
immago = Image.Load("/percorso/del/file/immagine")
' Centra l'immagine all'interno della DrawingArea:
verticeX = (DrawingArea1.W - immago.W) / 2
verticeY = (DrawingArea1.H - immago.H) / 2
' Individua il centro dell'immagine:
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
With Paint
.Brush = hBrush
.Arc(centroX, centroY, immago.W / 2)
.Fill
End With
End
Public Sub Slider1_Change()
DrawingArea1.Refresh
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("/percorso/del/file/immagine")
With DrawingArea1
.W = im.W
.h = im.H
End With
End
Public Sub DrawingArea1_Draw()
Dim pb As PaintBrush
With Paint
pb = .Image(im)
pb.Scale(DrawingArea1.W / im.W, DrawingArea1.H / im.H)
.Translate(im.W / 2, im.H / 2)
.Rotate(Rad(-1 * c))
.Translate(- im.W / 2, - im.H / 2)
.Brush = pb
.Rectangle(0, 0, DrawingArea1.W, DrawingArea1.H)
.Fill
.End
End With
End
Public Sub Slider1_Change()
c = Slider1.Value
DrawingArea1.Refresh()
End
Public Sub DrawingArea1_MouseWheel()
c = c + (1 * Mouse.Delta)
Slider1.Value = c
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
Note
[1] Vedere anche questa pagina: Ruotare qualsiasi elemento da disegnare in una DrawingArea