Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"
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 14: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 .