Differenze tra le versioni di "Ruotare un'immagine sul proprio asse centrale in una DrawingArea"
Da Gambas-it.org - Wikipedia.
(Creata pagina con "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: Pr...") |
|||
(18 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: | + | Nel caso in cui si debba far ruotare in una ''DrawingArea'' un'immagine sul proprio asse centrale <SUP>[[[#Note|nota 1]]]</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 | ||
− | Private | + | Private fAngolo As Float |
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
Riga 11: | Riga 11: | ||
.Arrangement = Arrange.Fill | .Arrangement = Arrange.Fill | ||
End With | End With | ||
− | DrawingArea1 = New DrawingArea As "DrawingArea1" | + | DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" |
im = Image.Load("<FONT Color=gray>''/percorso/della/immagine''</font>") | im = Image.Load("<FONT Color=gray>''/percorso/della/immagine''</font>") | ||
Riga 17: | Riga 17: | ||
'''End''' | '''End''' | ||
− | '''Public''' Sub DrawingArea1_MouseUp() | + | '''Public''' Sub DrawingArea1_MouseUp() <FONT Color=gray>' ''Cliccando sulla "DrawingArea", si avvierà la rotazione dell'immagine''</font> |
− | + | While Object.IsValid(DrawingArea1) | |
− | + | fAngolo += 10.0 | |
DrawingArea1.Refresh | DrawingArea1.Refresh | ||
Wait 0.1 | Wait 0.1 | ||
− | + | wend | |
'''End''' | '''End''' | ||
Riga 30: | Riga 30: | ||
With Paint | With Paint | ||
− | <FONT Color=gray>' ''Pone il centro di rotazione al centro della "DrawingArea" | + | <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) | .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) | ||
− | .Rotate(Rad( | + | <FONT Color=gray>' ''Ponendo un valore negativo come parametro della funzione "Rad()", si otterrà la rotazione in senso orario:''</font> |
+ | .Rotate(Rad(<FONT Color=#B22222><B>-</b></font>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 | ||
Riga 38: | Riga 40: | ||
'''End''' | '''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)) | ||
+ | .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. | ||
+ | <BR>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") | ||
+ | <FONT Color=gray>' ''Ingrandisce un po' l'immagine che sarà posta al di sotto dell'altra:''</font> | ||
+ | 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() <FONT Color=gray>' ''Cliccando sulla "DrawingArea", si produrrà la rotazione delle due immagini''</font> | ||
+ | |||
+ | 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: | ||
+ | * [[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: