Differenze tra le versioni di "Ruotare un cerchio disegnato in una DrawingArea"
Da Gambas-it.org - Wikipedia.
Riga 17: | Riga 17: | ||
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
− | + | Me.Center | |
− | + | With da | |
+ | .x = 0 | ||
+ | .Y = 0 | ||
+ | .W = Me.W | ||
+ | .H = Me.H | ||
+ | End With | ||
'''End''' | '''End''' | ||
Riga 26: | Riga 31: | ||
'''Public''' Sub da_Draw() | '''Public''' Sub da_Draw() | ||
− | + | Dim c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red] | |
− | + | Dim f As Float[] = [0, 0.34, 0.67, 1] | |
− | <FONT Color=gray>' ''L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo | + | |
− | + | iLarg = 200 | |
− | + | iAlt = 200 | |
− | + | <FONT Color=gray>' ''L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo. 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)) | ||
+ | y = CFloat((da.H / 2) - (iAlt / 2)) | ||
<FONT Color=gray>' ''In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:''</font> | <FONT Color=gray>' ''In questa dimostrazione il fulcro (vortice) è sempre il centro dell'area di disegno:''</font> | ||
− | + | fSopra1 = CFloat((da.W / 2)) | |
− | + | fSopra2 = CFloat(da.H / 2) | |
− | + | fSotto1 = CFloat(- (da.W / 2)) | |
− | + | fSotto2 = CFloat(- (da.H / 2)) | |
− | + | With Paint | |
− | + | .Brush = .LinearGradient(0, 20, 15, 0, c, f) | |
<FONT Color=gray>' ''Vortice:''</font> | <FONT Color=gray>' ''Vortice:''</font> | ||
− | + | .Translate(fSopra1, fSopra2) | |
− | + | .Rotate(Rad(fAngolo)) | |
− | + | .Translate(fSotto1, fSotto2) | |
− | + | .Ellipse(x, y, iLarg, iAlt, Rad(360), Rad(360), True) | |
− | + | .Stroke | |
− | + | .End | |
− | + | End With | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
'''End''' | '''End''' | ||
Riga 63: | Riga 62: | ||
'''Public''' Sub Form_KeyPress() | '''Public''' Sub Form_KeyPress() | ||
− | + | Select Case Key.Code | |
− | + | Case Key.Up | |
− | + | fAngolo += 1 | |
− | + | If fAngolo = 361 Then fAngolo = 1 | |
− | + | da.Refresh | |
− | + | Case Key.Down | |
− | + | fAngolo -= 1 | |
− | + | If fAngolo = -361 Then fAngolo = -1 | |
− | + | da.Refresh | |
− | + | End Select | |
'''End''' | '''End''' | ||
Riga 79: | Riga 78: | ||
'''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> | ||
− | + | da.Refresh | |
'''End''' | '''End''' | ||
− | |||
Versione delle 18:43, 2 giu 2021
Mostriamo un possibile codice Nota1 per ottenere la rotazione intorno al proprio asse centrale di un cerchio, disegnato in una DrawingArea.
Nell'esempio la rotazione del cerchio potrà essere notata attraverso visualizzazione della rotazione del suo raggio. La rotazione viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.
' Il fulcro di Translate agisce da vortice. Private x As Float ' Memorizza l'inizio del cerchio. Private y As Float ' Idem Private iAlt As Integer ' Memorizza l'altezza del cerchio. Private iLarg As Integer ' Memorizza la larghezza del cerchio. 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 With da .x = 0 .Y = 0 .W = Me.W .H = Me.H End With End Public Sub da_Draw() Dim c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red] Dim f As Float[] = [0, 0.34, 0.67, 1] iLarg = 200 iAlt = 200 ' L'angolo di rotazione è posto al centro dell'area di disegno, così come le misure di partenza e di arrivo. 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 .Brush = .LinearGradient(0, 20, 15, 0, c, f) ' Vortice: .Translate(fSopra1, fSopra2) .Rotate(Rad(fAngolo)) .Translate(fSotto1, fSotto2) .Ellipse(x, y, iLarg, iAlt, Rad(360), Rad(360), True) .Stroke .End End With End Public Sub Form_KeyPress() Select Case Key.Code Case Key.Up fAngolo += 1 If fAngolo = 361 Then fAngolo = 1 da.Refresh Case Key.Down fAngolo -= 1 If fAngolo = -361 Then fAngolo = -1 da.Refresh End Select End Public Sub Form_Resize() ' Con questo evento se cambia la dimensione del Form, il disegna non va perso. da.Refresh End
Nota
[1] Il codice, presente in questa pagina, è tratto - con modifiche ed integrazioni - da un analogo codice suggerito dal membro Gianluigi del forum di gambas-it.org .