Ruotare un quadrato ed un rettangolo in una DrawingArea
Mostriamo due analoghi possibili codici [Nota 1] per far ruotare su se stessi, ossia intorno al proprio asse centrale, un quadrato ed un rettangolo disegnati su una DrawingArea. [Nota 2]
In entrambi gli esempi la rotazione del quadrato e del rettangolo viene effettuata premendo i tasti freccia in su e freccia in giù della tastiera.
Ruotare un quadrato sul proprio asse centrale
Per ottenere la rotazione sul proprio asse centrale di un quadrato disegnato in una DrawingArea è possibile adottare il seguente codice:
' Il fulcro del Metodo ".Translate()" agisce da vortice, da centro di rotazione intorno a una ipotetica circonferenza Private da As DrawingArea Private Const LATO As Short = 200 ' Memorizza il diametro del quadrato. Private fAngolo As Float ' Memorizza i gradi dell'angolo. Public Sub Form_Open() With Me .W = LATO * 2 .H = .W .Center .Arrangement = Arrange.Fill End With With da = New DrawingArea(Me) As "da" .x = 0 .Y = 0 .Background = Color.White 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] With Paint .Brush = .LinearGradient(0, 20, 15, 0, c, f) ' Il fulcro (vortice) della rotazione è sempre il centro dell'area di disegno: .Translate(da.W / 2, da.H / 2) .Rotate(Rad(fAngolo)) .LineWidth = 2.0 ' Disegna il quadrato. ' Siccome l'angolo ruota su se stesso, si dà alle coordinate del quadrato la metà della dimensione del suo lato: .Rectangle(LATO / 2, LATO / 2, -LATO, -LATO) .Stroke .End End With End Public Sub Form_KeyPress() Select Case Key.Code Case Key.Up fAngolo += 1 If fAngolo = 361 Then fAngolo = 1 Case Key.Down fAngolo -= 1 If fAngolo = -361 Then fAngolo = -1 End Select da.Refresh End Public Sub Form_Resize() ' Con questo evento se cambia la dimensione del Form, il disegna non va perso. da.Refresh End
Ruotare un rettangolo sul proprio asse centrale
Per ottenere la rotazione sul proprio asse centrale di un rettangolo disegnato in una DrawingArea è possibile adottare il seguente codice analogo al precedente:
' Il fulcro del Metodo ".Translate()" agisce da vortice, da centro di rotazione intorno a una ipotetica circonferenza Private da As DrawingArea Private Const ORIZZONTALE As Short = 200 ' Memorizza la dimensione di ciascun lato orizzontale. Private Const VERTICALE As Short = 100 ' Memorizza la dimensione di ciascun lato verticale. Private fAngolo As Float ' Memorizza i gradi dell'angolo. Public Sub Form_Open() With Me .W = Max(ORIZZONTALE, VERTICALE) * 4 .H = .W / 2 .Center .Arrangement = Arrange.Fill End With With da = New DrawingArea(Me) As "da" .x = 0 .Y = 0 .Background = Color.White 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] With Paint .Brush = .LinearGradient(0, 20, 15, 0, c, f) ' Il fulcro (vortice) della rotazione è sempre il centro dell'area di disegno: .Translate(da.W / 2, da.H / 2) .Rotate(Rad(fAngolo)) .LineWidth = 2.0 ' Disegna il quadrato. ' Siccome l'angolo ruota su se stesso, si dà alle coordinate del rettangolo la metà della dimensione di ciascun suo lato: .Rectangle(ORIZZONTALE / 2, VERTICALE / 2, -ORIZZONTALE, -VERTICALE) .Stroke .End End With End Public Sub Form_KeyPress() Select Case Key.Code Case Key.Up fAngolo += 1 If fAngolo = 361 Then fAngolo = 1 Case Key.Down fAngolo -= 1 If fAngolo = -361 Then fAngolo = -1 End Select da.Refresh End Public Sub Form_Resize() ' Con questo evento se cambia la dimensione del Form, il disegna non va perso. da.Refresh End
Note
[1] I codici, presenti in questa pagina, sono tratti - con modifiche ed integrazioni - da suggerimenti del membro Gianluigi del forum di gambas-it.org e del membro Shell del forum www.gambas-es.org .
[2] Vedere anche queste pagine: