Ruotare una immagine sul proprio asse centrale: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| (12 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 1: | Riga 1: | ||
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' | 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== | ==Uso del Metodo ".Rotate()" della Classe Image== | ||
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() | |||
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= | .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 = | .W = .Image.W | ||
.H = | .H = .Image.H | ||
.Image = .Image.<FONT Color=#B22222>Rotate(Rad(r))</font> | .Image = .Image.<FONT Color=#B22222>Rotate(Rad(r))</font> | ||
End With | End With | ||
Wait 0. | Wait 0.01 | ||
Inc r | Inc r | ||
If r == 360 Then r = 0 | |||
Wend | Wend | ||
End | |||
| Riga 28: | Riga 29: | ||
Mostriamo un semplice e pratico esempio: | Mostriamo un semplice e pratico esempio: | ||
Public Sub Form_Activate() | |||
Dim im As Image | Dim im As Image | ||
| Riga 35: | Riga 36: | ||
Dim s As Short | Dim s As Short | ||
im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") | |||
With hs = New HSplit(Me) | |||
.X = 20 | |||
.Y = 20 | |||
.W = im.W | |||
.H = im.H | |||
End With | |||
With pbx = New PictureBox(hs) | |||
.<FONT Color=#B22222>Alignment = Align.Center</font> | |||
.Expand = True | |||
.Image = im | |||
End With | |||
Do | |||
For s = 0 To 360 | |||
pbx.Image = im.<FONT Color=#B22222>Rotate(Rad(s))</font> | |||
Wait 0.01 | |||
Next | |||
Loop | |||
<FONT Color=gray>' ''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'''</font> | |||
End | |||
Per effettuare la rotazione al contrario la riga del ciclo " | 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 | ||
==Uso di una ''DrawingArea'' e dei Metodi ".Rotate()" e ".Translate()" della Classe "Paint"== | ==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". <SUP>[[[#Note| | Un'altra modalità prevede l'uso di una ''DrawingArea'' e dei Metodi ".Rotate()" e ".Translate()" della Classe "Paint". <SUP>[[[#Note|<B>nota 1</b>]]]</sup> | ||
La rotazione dell'immagine viene esercitata dal metodo | La rotazione dell'immagine viene esercitata dal metodo | ||
| Riga 69: | Riga 80: | ||
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 | 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() | |||
im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") | |||
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 | With Paint | ||
. | <FONT Color=gray>' ''Imposta il fulcro/punto della rotazione - ad esempio -al centro dell'area di disegno:''</font> | ||
. | <FONT Color=red>.Translate</font>(DrawingArea1.W / 2, DrawingArea1.H / 2) | ||
. | <FONT color=gray>' ''Ruota l'immagine:''</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.'' | |||
' ''Non si devono modificare i valori né i segni degli ultimi quattro argomenti qui riportati.''</font> | |||
.DrawImage(im, -im.W / 2, -im.H / 2, -im.W, -im.H) | |||
.End | |||
End With | 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 | DrawingArea1.Refresh | ||
End | |||
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 | |||
=Note= | =Note= | ||
[1] Vedere anche | [1] Vedere anche queste pagine: | ||
* [[Ruotare un'immagine sul proprio asse centrale 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: