Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"
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 | + | 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>") | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | 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 With | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''End''' | '''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 = Paint.Image(im) | |
− | .Translate( | + | <FONT color=gray>' ''Il fulcro (vortice) della rotazione è sempre il centro dell'area di disegno:''</font> |
− | .Rotate(Rad( | + | .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) |
− | . | + | <FONT color=gray>' ''Ruota l'immagine:''</font> |
− | + | .<FONT Color=#B22222>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> | |
− | + | .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 | ||
− | + | DrawingArea1.Refresh | |
− | + | ||
− | |||
− | |||
− | 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.Refresh | |
− | |||
− | DrawingArea1.Refresh | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''End''' | '''End''' | ||
Riga 231: | Riga 137: | ||
---- | ---- | ||
=Note= | =Note= | ||
− | [1] Vedere anche | + | [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 20: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à.
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 = 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: