Differenze tra le versioni di "Ruotare un arco in una DrawingArea"
Da Gambas-it.org - Wikipedia.
Riga 1: | Riga 1: | ||
− | + | Mostriamo un possibile codice [[#Nota|<SUP>Nota1</sup>]] per ottenere la rotazione <SPAN Style="text-decoration:underline">intorno al proprio asse centrale</span> di un arco di cerchio (il centro di rotazione è posto sulla corda dell'arco), disegnato in una ''DrawingArea''. | |
+ | <BR>La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera. | ||
− | <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. | + | <FONT Color=gray>' '''''Il fulcro di Translate agisce da vortice. (L'arco ruota a seconda di dove esso si pone nel vortice: in questo caso al centro).'''''</font> |
Private x As Float <FONT Color=gray>' ''Memorizza l'inizio dell'arco.''</font> | Private x As Float <FONT Color=gray>' ''Memorizza l'inizio dell'arco.''</font> | ||
Riga 27: | Riga 28: | ||
iLarg = 200 | iLarg = 200 | ||
iAlt = 200 | iAlt = 200 | ||
− | <FONT Color=gray>' '' | + | <FONT Color=gray>' ''Posiziona l'angolo al centro dell'area di disegno, così come le misure di partenza e di arrivo; |
− | + | ' ''e siccome l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo:''</font> | |
x = CFloat((da.W / 2) - (iLarg / 2)) | x = CFloat((da.W / 2) - (iLarg / 2)) | ||
y = CFloat((da.H / 2) - (iAlt / 2)) | y = CFloat((da.H / 2) - (iAlt / 2)) | ||
Riga 50: | Riga 51: | ||
'''End''' | '''End''' | ||
− | |||
'''Public''' Sub attivaDisegno() | '''Public''' Sub attivaDisegno() | ||
− | + | ||
da.Clear | da.Clear | ||
da.Refresh | da.Refresh | ||
− | + | ||
'''End''' | '''End''' | ||
− | '''Public''' Sub | + | '''Public''' Sub Form_KeyPress() |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | attivaDisegno() | + | Select Case Key.Code |
+ | Case Key.Up | ||
+ | fAngolo += 1 | ||
+ | If fAngolo = 361 Then fAngolo = 1 | ||
+ | attivaDisegno() | ||
+ | Case Key.Down | ||
+ | fAngolo -= 1 | ||
+ | If fAngolo = -361 Then fAngolo = -1 | ||
+ | attivaDisegno() | ||
+ | End Select | ||
'''End''' | '''End''' | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''Public''' Sub Form_Resize() <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegna non va perso.''</font> | '''Public''' Sub Form_Resize() <FONT Color=gray>' ''Con questo evento se cambia la dimensione del Form, il disegna non va perso.''</font> | ||
Riga 96: | Riga 86: | ||
---- | ---- | ||
=Nota= | =Nota= | ||
− | [1] | + | [1] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da analogo codice suggerito dal membro ''Gianluigi'' del forum di ''gambas-it.org'' . |
Versione delle 18:44, 3 ott 2015
Mostriamo un possibile codice Nota1 per ottenere la rotazione intorno al proprio asse centrale di un arco di cerchio (il centro di rotazione è posto sulla corda dell'arco), disegnato in una DrawingArea.
La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.
' Il fulcro di Translate agisce da vortice. (L'arco ruota a seconda di dove esso si pone nel vortice: in questo caso al centro). Private x As Float ' Memorizza l'inizio dell'arco. Private y As Float ' Idem Private iAlt As Integer ' Memorizza l'altezza dell'arco. Private iLarg As Integer ' Memorizza la larghezza dell'arco. Private fAngolo As Float ' Memorizza i gradi dell'angolo. Private fSopra1 As Float ' Memorizza la posizione di partenza orizzontale della rotazione. Private fSopra2 As Float ' Memorizza la posizione di partenza verticale della rotazione. Private fSotto1 As Float ' Memorizza la posizione di arrivo orizzontale della rotazione. Private fSotto2 As Float ' Memorizza la posizione di arrivo verticale della rotazione. Public Sub Form_Open() Me.Center attivaDisegno() End Public Sub da_Draw() iLarg = 200 iAlt = 200 ' Posiziona l'angolo al centro dell'area di disegno, così come le misure di partenza e di arrivo; ' e siccome l'angolo ruota su se stesso, si dà al raggio del cerchio mezza lunghezza dell'angolo: x = CFloat((da.W / 2) - (iLarg / 2)) y = CFloat((da.H / 2) - (iAlt / 2)) ' In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno: fSopra1 = CFloat((da.W / 2)) fSopra2 = CFloat(da.H / 2) fSotto1 = CFloat(- (da.W / 2)) fSotto2 = CFloat(- (da.H / 2)) With Paint .Begin(da) ' Vortice: .Translate(fSopra1, fSopra2) .Rotate(Rad(fAngolo)) .Translate(fSotto1, fSotto2) .Ellipse(x, y, iLarg, iAlt, Rad(180), Rad(180), True) .Stroke .End End With End Public Sub attivaDisegno() da.Clear da.Refresh End Public Sub Form_KeyPress() Select Case Key.Code Case Key.Up fAngolo += 1 If fAngolo = 361 Then fAngolo = 1 attivaDisegno() Case Key.Down fAngolo -= 1 If fAngolo = -361 Then fAngolo = -1 attivaDisegno() End Select End Public Sub Form_Resize() ' Con questo evento se cambia la dimensione del Form, il disegna non va perso. attivaDisegno() End
Nota
[1] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da analogo codice suggerito dal membro Gianluigi del forum di gambas-it.org .