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 an As Float
 
Public Sub Form_Open()

 Me.Arrangement = Arrange.Fill

 With DrawingArea1
   .X = 0
   .Y = 0
 End With
 
 With 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 an As Float
 
Public Sub Form_Open()

 Me.Arrangement = Arrange.Fill

 With DrawingArea1
   .X = 0
   .Y = 0
 End With
 
 With 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