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

Da Gambas-it.org - Wikipedia.
(5 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Nel caso in cui si debba far ruotare in una ''DrawingArea'' un'immagine sul proprio asse centrale, sia essa quadrata o rettangolare, si potrà adottare il seguente codice (cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine):
+
Nel caso in cui si debba far ruotare in una ''DrawingArea'' un'immagine sul proprio asse centrale <SUP>&#091;[[#Note|nota 1]]&#093;</sup>, sia essa <SPAN Style="text-decoration:underline">quadrata o rettangolare</span>, si potrà adottare il seguente codice (cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine):
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 
  Private im As Image
 
  Private im As Image
Riga 87: Riga 87:
  
  
===Far ruotare due immagini, ciascuna in senso inverso all'altra===
+
===Far ruotare due immagini sovrapposte, ciascuna in senso inverso rispetto all'altra===
In questo caso abbiamo due immagini che porremo ancora una volta una sopra l'altra. Quella posta al livello superiore, avrà sfondo trasparente.
+
In questo caso abbiamo nuovamente due immagini sovrapposte. Quella posta al livello superiore, avrà sfondo trasparente.
<BR>Ruotando la rotellina del mouse, ciascuna immagine ruoterà in senso inverso rispetto all'altra.
+
<BR>Il seguente codice farà sì che ciascuna immagine ruoti in senso inverso rispetto all'altra.
 
 
Come codice riprendiamo quello appena sopra, modificandolo opportunamente.  
 
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 
  Private qd As Image
 
  Private qd As Image
Riga 143: Riga 141:
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
 +
 +
 +
=Nota=
 +
[1] Vedere anche le seguenti pagine:
 +
* [[Ruotare qualsiasi elemento da disegnare in una DrawingArea]]
 +
* [[Ruotare una immagine sul proprio asse centrale]]

Versione delle 18:28, 26 mag 2023

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/breeze-dark/devices/64/media-optical-blu-ray.svg")
 im = Image.Load("/usr/share/icons/breeze-dark/apps/32/system-help.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/breeze-dark/apps/64/diaspora.svg")
' Ingrandisce un po' l'immagine che sarà posta al di sotto dell'altra:
 qd = qd.Stretch(qd.W * 1.1, qd.H * 1.1, False)

 im = Image.Load("/usr/share/icons/breeze-dark/apps/32/system-help.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
   .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)
   .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)
   .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)
   .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: