Ruotare una immagine sul proprio asse centrale: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 47: | Riga 47: | ||
End With | End With | ||
'''End''' | |||
In quest'altro esempio, simile al precedente, sarà possibile ruotare un'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("/home/ploppo/Scrivania/immago2.png") | |||
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''' | '''End''' | ||
Versione delle 15:51, 25 mar 2015
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 una modalità che prevede l'uso di una DrawingArea.
Con questa modalità utilizziamo le risorse delle Classi Paint e PaintBrush |1| e poniamo sul Form una DrawingArea.
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/dell'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, simile al precedente, sarà possibile ruotare un'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("/home/ploppo/Scrivania/immago2.png")
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] L'uso combinato delle Classi Paint e PaintBrush, come nell'esempio, evita che l'oggetto Image si sposti in senso verticale e/o orizzontale durante la sua rotazione, come avviene se si utilizza semplicemente il metodo .Rotate() della Classe Image .