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

Da Gambas-it.org - Wikipedia.
Riga 2: Riga 2:
 
  Private DrawingArea1 As DrawingArea
 
  Private DrawingArea1 As DrawingArea
 
  Private im As Image
 
  Private im As Image
  Private c As Short
+
  Private fAngolo As Float
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
Riga 20: Riga 20:
 
   
 
   
 
   While Object.IsValid(DrawingArea1)
 
   While Object.IsValid(DrawingArea1)
     c += 10
+
     fAngolo += 10
 
     DrawingArea1.Refresh
 
     DrawingArea1.Refresh
 
     Wait 0.1
 
     Wait 0.1
Riga 33: Riga 33:
 
  ' ''Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.''</font>
 
  ' ''Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.''</font>
 
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
 
     .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
     .Rotate(Rad(c))
+
     .Rotate(Rad(fAngolo))
 
     .DrawImage(im, <FONT Color=#B22222>-im.W / 2</font>, <FONT Color=#B22222>-im.H / 2</font>, im.W, im.H, 1.0, Null)
 
     .DrawImage(im, <FONT Color=#B22222>-im.W / 2</font>, <FONT Color=#B22222>-im.H / 2</font>, 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()  <FONT Color=gray>' ''Ruotando la rotellina del mouse, si produrrà la  rotazione dell'immagine superiore''</font>
 +
 +
  fAngolo += Mouse.Delta
 +
 +
  DrawingArea1.Refresh
 +
 +
'''End'''
 +
 +
'''Public''' Sub DrawingArea1_Draw()
 +
 +
  With Paint
 +
<FONT Color=gray>' ''Disegna l'immagine inferiore che resterà ferma:''</font>
 +
    .DrawImage(qd, (DrawingArea1.W / 2) - (qd.W * 0.5), (DrawingArea1.H / 2) - (qd.H * 0.5), qd.W, qd.H, 1.0, Null)
 +
<FONT Color=gray>' ''Pone il centro di rotazione al centro della "DrawingArea".''
 +
' ''Il fulcro del Metodo ".Translate()" agisce da centro di rotazione intorno a una ipotetica circonferenza.''</font>
 +
    .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2)
 +
    .Rotate(Rad(fangolo + 7))
 +
    .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null)
 
     .End
 
     .End
 
   End With
 
   End With
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 15:44, 26 mag 2023

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):

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
   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)
   .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 + 7))
   .DrawImage(im, -im.W / 2, -im.H / 2, im.W, im.H, 1.0, Null)
   .End
 End With

End