Differenze tra le versioni di "Ruotare un'immagine sul proprio asse centrale in una DrawingArea"

Da Gambas-it.org - Wikipedia.
Riga 4: Riga 4:
 
  Private fAngolo As Float
 
  Private fAngolo As Float
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   With Me
 
   With Me
Riga 15: Riga 15:
 
   im = Image.Load("<FONT Color=gray>''/percorso/della/immagine''</font>")
 
   im = Image.Load("<FONT Color=gray>''/percorso/della/immagine''</font>")
 
    
 
    
  '''End'''
+
  End
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseUp()  <FONT Color=gray>' ''Cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine''</font>
+
   
 +
Public Sub DrawingArea1_MouseUp()  <FONT Color=gray>' ''Cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine''</font>
 
   
 
   
 
   While Object.IsValid(DrawingArea1)
 
   While Object.IsValid(DrawingArea1)
Riga 25: Riga 26:
 
   wend
 
   wend
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
  Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
Riga 39: Riga 41:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
  
Riga 49: Riga 51:
 
  Private fAngolo As Float
 
  Private fAngolo As Float
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   With Me
 
   With Me
Riga 58: Riga 60:
 
   DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
   DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
    
 
    
   qd = Image.Load("/usr/share/icons/breeze-dark/devices/64/media-optical-blu-ray.svg")
+
   qd = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/64x64/apps/simon.svg")
   im = Image.Load("/usr/share/icons/breeze-dark/apps/32/system-help.svg")
+
   im = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/32x32/apps/simon.svg")
 
    
 
    
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub Form_MouseWheel()  <FONT Color=gray>' ''Ruotando la rotellina del mouse, si produrrà la rotazione dell'immagine superiore''</font>
+
  Public Sub Form_MouseWheel()  <FONT Color=gray>' ''Ruotando la rotellina del mouse, si produrrà la rotazione dell'immagine superiore''</font>
 
   
 
   
 
   fAngolo += Mouse.Delta
 
   fAngolo += Mouse.Delta
Riga 69: Riga 72:
 
   DrawingArea1.Refresh
 
   DrawingArea1.Refresh
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
  Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
Riga 84: Riga 88:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
  
Riga 95: Riga 99:
 
  Private fAngolo As Float
 
  Private fAngolo As Float
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
 
   With Me
 
   With Me
Riga 104: Riga 108:
 
   DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
   DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
    
 
    
   qd = Image.Load("/usr/share/icons/breeze-dark/apps/64/diaspora.svg")
+
   qd = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/64x64/apps/simon.svg")
<FONT Color=gray>' ''Ingrandisce un po' l'immagine che sarà posta al di sotto dell'altra:''</font>
+
   im = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/32x32/apps/simon.svg")
   qd = qd.Stretch(qd.W * 1.1, qd.H * 1.1, False)
+
 
 +
End
 
   
 
   
  im = Image.Load("/usr/share/icons/breeze-dark/apps/32/system-help.svg")
 
 
 
'''End'''
 
 
   
 
   
  '''Public''' Sub DrawingArea1_MouseUp()  <FONT Color=gray>' ''Cliccando sulla "DrawingArea", si produrrà la rotazione delle due immagini''</font>
+
  Public Sub DrawingArea1_MouseUp()  <FONT Color=gray>' ''Cliccando sulla "DrawingArea", si produrrà la rotazione delle due immagini''</font>
 
   
 
   
 
   While Object.IsValid(DrawingArea1)
 
   While Object.IsValid(DrawingArea1)
Riga 120: Riga 122:
 
   Wend
 
   Wend
 
   
 
   
  '''End'''
+
  End
 +
 
   
 
   
  '''Public''' Sub DrawingArea1_Draw()
+
  Public Sub DrawingArea1_Draw()
 
   
 
   
 
   With Paint
 
   With Paint
    .DrawImage(qd, (DrawingArea1.W / 2) - (qd.W * 0.5), (DrawingArea1.H / 2) - (qd.H * 0.5), qd.W, qd.H, 1.0, Null)
 
 
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
 
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
 
     .Rotate(Rad(-fangolo))
 
     .Rotate(Rad(-fangolo))
Riga 133: Riga 135:
 
   With Paint
 
   With Paint
 
     .Begin(DrawingArea1)
 
     .Begin(DrawingArea1)
    .DrawImage(im, (DrawingArea1.W / 2) - (im.W * 0.5), (DrawingArea1.H / 2) - (im.H * 0.5), im.W, im.H, 1.0, Null)
 
 
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
 
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
 
     .Rotate(Rad(fangolo))
 
     .Rotate(Rad(fangolo))
Riga 140: Riga 141:
 
   End With
 
   End With
 
   
 
   
  '''End'''
+
  End
  
  

Versione delle 08:15, 28 mag 2024

Nel caso in cui si debba far ruotare in una DrawingArea un'immagine sul proprio asse centrale [nota 1], sia essa quadrata o rettangolare, si potrà adottare il seguente codice (cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine):

Private DrawingArea1 As DrawingArea
Private im As Image
Private fAngolo As Float

Public Sub Form_Open()

 With Me
   .W = Screen.AvailableWidth
   .H = Screen.AvailableHeight
   .Arrangement = Arrange.Fill
 End With
 DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
 im = Image.Load("/percorso/della/immagine")
 
End


Public Sub DrawingArea1_MouseUp()  ' Cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine

 While Object.IsValid(DrawingArea1)
   fAngolo += 10.0
   DrawingArea1.Refresh
   Wait 0.1
 wend

End


Public Sub DrawingArea1_Draw()

 With Paint
' Pone il centro di rotazione al centro della "DrawingArea".
' Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
' Ponendo un valore negativo come parametro della funzione "Rad()", si otterrà la rotazione in senso orario:
   .Rotate(Rad(-fAngolo))
   .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null)
   .End
 End With

End


Far ruotare un'immagine, avente sfondo trasparente, su un'altra immagine

In questo caso si riprenderà il codice sopra mostrato, aggiungendo nella Sub "DrawingArea1_Draw()" semplicemente la riga necessaria per mostrare l'immagine di base che resterà ferma:

Private DrawingArea1 As DrawingArea
Private qd As Image
Private im As Image
Private fAngolo As Float

Public Sub Form_Open()

 With Me
   .W = Screen.AvailableWidth * 0.33
   .H = Screen.AvailableHeight * 0.33
   .Arrangement = Arrange.Fill
 End With
 DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
 qd = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/64x64/apps/simon.svg")
 im = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/32x32/apps/simon.svg")
 
End


Public Sub Form_MouseWheel()  ' Ruotando la rotellina del mouse, si produrrà la rotazione dell'immagine superiore

 fAngolo += Mouse.Delta

 DrawingArea1.Refresh

End


Public Sub DrawingArea1_Draw()

 With Paint
' Disegna l'immagine inferiore che resterà ferma:
   .DrawImage(qd, (DrawingArea1.W / 2) - (qd.W * 0.5), (DrawingArea1.H / 2) - (qd.H * 0.5), qd.W, qd.H, 1.0, Null)
' Pone il centro di rotazione al centro della "DrawingArea".
' Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
   .Rotate(Rad(fangolo))
   .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null)
   .End
 End With

End


Far ruotare due immagini sovrapposte, ciascuna in senso inverso rispetto all'altra

In questo caso abbiamo nuovamente due immagini sovrapposte. Quella posta al livello superiore, avrà sfondo trasparente.
Il seguente codice farà sì che ciascuna immagine ruoti in senso inverso rispetto all'altra.

Private DrawingArea1 As DrawingArea
Private qd As Image
Private im As Image
Private fAngolo As Float

Public Sub Form_Open()

 With Me
   .W = Screen.AvailableWidth * 0.33
   .H = Screen.AvailableHeight * 0.33
   .Arrangement = Arrange.Fill
 End With
 DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
 
 qd = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/64x64/apps/simon.svg")
 im = Image.Load("/usr/share/icons/Gruvbox-Material-Dark/32x32/apps/simon.svg")
 
End


Public Sub DrawingArea1_MouseUp()  ' Cliccando sulla "DrawingArea", si produrrà la rotazione delle due immagini

 While Object.IsValid(DrawingArea1)
   fAngolo += 10.0
   DrawingArea1.Refresh
   Wait 0.1
 Wend

End


Public Sub DrawingArea1_Draw()

 With Paint
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
   .Rotate(Rad(-fangolo))
   .DrawImage(qd, -qd.W / 2, -qd.H / 2, qd.W, qd.H, 1.0, Null)
   .End
 End With
 With Paint
   .Begin(DrawingArea1)
   .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
   .Rotate(Rad(fangolo))
   .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null)
   .End
 End With

End


Nota

[1] Vedere anche le seguenti pagine: