Differenze tra le versioni di "Ruotare una immagine sul proprio asse centrale"

Da Gambas-it.org - Wikipedia.
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 .