Ruotare un esagono in una DrawingArea
Di seguito mostreremo un possibile codice per ruotare un Esagono regolare disegnato in una DrawingArea. [Nota 1]
I 6 vertici dell'Esagono regolare sono stati correttamente individuati sulla circonferenza ideale, alla quale detti vertici appartengono, dividendo l'angolo di 360° per il numero dei vertici dell'Esagono (360° / 6 = 60°). Ciascun vertice si troverà sulla circonferenza ogni 60 gradi.
E' possibile variare la dimensione del Esagono, modificando il raggio della circonferenza, sulla quale i suoi vertici insistono.
La rotazione dell'Esagono si avvia semplicemente cliccando con il tasto sinistro del mouse sulla superficie della DrawingArea.
Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza.
Private DrawingArea1 As DrawingArea Private Const RAGGIO As Single = 100.0 Private Const ESAGONO As Byte = 6 Private ANGOLO As Single = 0.8 Private an As Single Private xs As Single Private ys As Single Private coord As Single[] Private pol As New Single[] Private c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red] Private f As Float[] = [0, 0.34, 0.67, 1] Public Sub Form_Open() With Me .W = Screen.AvailableWidth .H = Screen.AvailableHeight .Arrangement = Arrange.Fill End With With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" .Background = Color.Lighter(Color.Yellow) End With End Public Sub Form_Arrange() coord = [DrawingArea1.W / 2, DrawingArea1.H / 2] For t As Short = 0 To 360 Step (360 / ESAGONO) pol.Push(RAGGIO * Cos(Rad(t))) pol.Push(RAGGIO * Sin(Rad(t))) Next xs = (coord[0] + coord[0] + pol[2] + coord[0] + Abs(pol[4]) + coord[0] - Abs(pol[6]) + coord[0] - pol[8] + coord[0] - pol[10]) / ESAGONO ys = (coord[1] + coord[1] + pol[3] + coord[1] + pol[5] + coord[1] + pol[7] + coord[1] + pol[9] + coord[1] + pol[11]) / ESAGONO End Public Sub DrawingArea1_MouseUp() While Object.IsValid(DrawingArea1) an += ANGOLO DrawingArea1.Refresh Wait 0.01 Wend End Public Sub DrawingArea1_Draw() With Paint .Arc(coord[0], coord[1], 2, Rad(0), Rad(360), False) .Fill .Brush = .LinearGradient(0, 20, 15, 0, c, f) .Translate(coord[0], coord[1]) ' Un valore negativo dell'argomento della funzione "Rad()", farà ruotare l'Esagono in senso orario: .Rotate(Rad(-an)) .Polygon([(coord[0] + pol[0]) - xs, (coord[1] + pol[1]) - ys, (coord[0] + pol[2]) - xs, (coord[1] + pol[3]) - ys, (coord[0] + pol[4]) - xs, (coord[1] + pol[5]) - ys, (coord[0] + pol[6]) - xs, (coord[1] + pol[7]) - ys, (coord[0] + pol[8]) - xs, (coord[1] + pol[9]) - ys, (coord[0] + pol[10]) - xs, (coord[1] + pol[11]) - ys]) .Stroke .End End With End
Note
[1] Vedere anche la seguente pagina: Ruotare un pentagono in una DrawingArea