Ruotare una figura piana intorno a una circonferenza in una DrawingArea
Da Gambas-it.org - Wikipedia.
Il caso è quello in cui si disegna in una DrawingArea una figura piana (ad esempio un cerchio) che ruota intorno a una circonferenza. [Nota 1]
Usando i Metodi "Paint.Translate()" e "Paint.Rotate()" per effettuare la rotazione
In questo esempio si utilizzeranno i Metodi "Paint.Translate()" e "Paint.Rotate()" per effettuare la rotazione. [Nota 2]
Private DrawingArea1 As DrawingArea Private Timer1 As Timer Private an As Float Public Sub Form_Open() Me.Arrangement = Arrange.Fill With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .X = 0 .Y = 0 End With With Timer1 = New Timer As "Timer1" .Delay = 10 .Start End With End Public Sub DrawingArea1_Draw() With Paint .Arc(DrawingArea1.W / 2, DrawingArea1.H / 2, 50, Rad(0), 360, False) .stroke .Translate(DrawingArea1.W / 2, DrawingArea1.H / 2) ' Un valore positivo dell'angolo di rotazione determina una rotazione in senso antiorario, mentre un valore negativo determina una rotazione in senso orario: .Rotate(Rad(-an)) .Brush = .Color(Color.Red) .Arc(40, 40, 5, Rad(0), 360, False) .Fill .End End With End Public Sub Timer1_Timer() Inc an DrawingArea1.Refresh End
Usando una formula trigonometrica per effettuare la rotazione
In questo esempio si utilizzerà una formula trigonometrica per effettuare la rotazione.
Private DrawingArea1 As DrawingArea Private Timer1 As Timer Private an As Float Public Sub Form_Open() Me.Arrangement = Arrange.Fill With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .X = 0 .Y = 0 End With With Timer1 = New Timer As "Timer1" .Delay = 10 .Start End With End Public Sub DrawingArea1_Draw() Dim x, y, r, t As Short x = DrawingArea1.W / 2 y = DrawingArea1.H / 2 ' Lunghezza del raggio della circonferenza: r = 50 With Paint .Arc(x, y, r, Rad(0), 360, False) .stroke .Brush = .Color(Color.Red) ' In quest'altro caso un valore positivo dell'angolo di rotazione determina una rotazione in senso orario, mentre un valore negativo determina una rotazione in senso antiorario: .Arc(x + (r * Cos(Rad(an))), y + (r * Sin(Rad(an))), 5, Rad(0), 360, False) .Fill .End End With End Public Sub Timer1_Timer() Inc an DrawingArea1.Refresh End
Note
[1] Per vedere lo spostamento di un punto lungo una circonferenza immaginaria in una DrawingArea: Disegnare in successione dei punti in una DrawingArea
[2] Vedere anche questa pagina: Ruotare qualsiasi elemento da disegnare in una DrawingArea