Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"
(10 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|<B> | + | 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 75: | Riga 86: | ||
− | + | Public Sub Form_Open() | |
− | im = Image.Load("<FONT Color= | + | im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") |
With Me | With Me | ||
Riga 92: | Riga 103: | ||
End With | End With | ||
− | + | End | |
− | |||
− | + | Public Sub DrawingArea1_Draw() | |
With Paint | With Paint | ||
− | <FONT | + | <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) | |
− | |||
− | .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) | ||
<FONT color=gray>' ''Ruota l'immagine:''</font> | <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 | + | <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) | .DrawImage(im, -im.W / 2, -im.H / 2, -im.W, -im.H) | ||
.End | .End | ||
End With | End With | ||
− | + | End | |
− | + | ||
+ | Public Sub Form_KeyPress() | ||
Select Case Key.Code | Select Case Key.Code | ||
Riga 125: | Riga 135: | ||
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 queste pagine: | [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 13: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à.
Indice
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: