Ruotare un esagono in una DrawingArea: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
(Creata pagina con "Di seguito mostreremo un possibile codice per ruotare un Esagono regolare disegnato in una ''DrawingArea''. <SUP>[Nota 1]</sup> I 6 vertici dell'Esagono r...")
 
Nessun oggetto della modifica
 
(6 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Di seguito mostreremo un possibile codice per ruotare un Esagono regolare disegnato in una ''DrawingArea''. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
Di seguito mostreremo un possibile codice per ruotare un Esagono regolare disegnato in una ''DrawingArea''. <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
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 del Pentagono (360° / 6 = 60°). Ogni vertice si troverà sulla circonferenza ogni 60 gradi.
<BR>E' possibile variare la dimensione del Esagono, modificando il raggio della circonferenza, sulla quale i suoi vertici insistono.
<BR>La rotazione dell'Esagono si avvia semplicemente cliccando con il tasto sinistro del mouse sulla superficie della ''DrawingArea''.
<BR>Il fulcro del Metodo ".Translate()" agisce da vortice, ossia da centro di rotazione intorno a una ipotetica circonferenza.
  Private DrawingArea1 As DrawingArea
  Private DrawingArea1 As DrawingArea
  Private Const <FONT Color=#B22222>RAGGIO</font> As Single = 100.0
Private Tmr As Timer
  Private Const ESAGONO As Byte = 6
  Private Const ScalaRaggio As Float = 0.2    <FONT Color=gray>' ''Scala del raggio (dimensione dell'esagono)''</font>
Private ANGOLO As Single = 0.8
  Private Rotazione As Float                  <FONT Color=gray>' ''Angolo di rotazione in radianti''</font>
Private an As Single
Private xs As Single
Private ys As Single
Private coord As Single[]
Private pol As New Single[]
   
   
   
   
Riga 19: Riga 9:
   
   
   With Me
   With Me
     .W = Screen.AvailableWidth
     .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
    .H = Screen.AvailableHeight
     .Arrangement = Arrange.Fill
     .Arrangement = Arrange.Fill
   End With
   End With
   With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
     .Background = Color.Lighter(Color.Yellow)
     .Background = Color.Lighter(Color.Yellow)
   End With
   End With
  Tmr = New Timer As "Tmr"
  Tmr.Delay = 30            <FONT Color=gray>' ''circa 33 FPS''</font>
  Tmr.Start()
   
   
  End
  End
   
   
Public Sub Form_Arrange()
   
   
  coord = [DrawingArea1.W / 2, DrawingArea1.H / 2]
Public Sub Tmr_Timer()
 
  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
Rotazione += Rad(1.5)         <FONT Color=gray>' ''Rotazione di 1.5° per frame''</font>
   ys = (coord[1] + coord[1] + pol[3] + coord[1] + pol[5] + coord[1] + pol[7] + coord[1] + pol[9] + coord[1] + pol[11]) / ESAGONO
   If Rotazione >= 2 * Pi Then
    Rotazione -= 2 * Pi
  End If
  DrawingArea1.Refresh()
   
   
  End
  End
   
   
Public Sub DrawingArea1_MouseUp()
   
   
  While Object.IsValid(DrawingArea1)
Public Sub DrawingArea1_Draw()
    an += ANGOLO
    DrawingArea1.Refresh
    Wait 0.01
  Wend
   
   
End
  Dim cx As Float = DrawingArea1.W / 2
  Dim cy As Float = DrawingArea1.H / 2
  Dim r As Float = Min(DrawingArea1.W, DrawingArea1.H) * ScalaRaggio
  Dim numSides As Integer = 6
  Dim angleStep As Float = 2 * Pi / numSides
  Dim points As New PointF[numSides]
  Dim i As Integer
   
   
Public Sub DrawingArea1_Draw()
  For i = 0 To numSides - 1
    Dim angle As Float = angleStep * i - Pi / 2 + Rotazione
    points[i] = New PointF(cx + r * Cos(angle), cy + r * Sin(angle))
  Next
   
   
   With Paint
   With Paint
     .Arc(coord[0], coord[1], 2, Rad(0), Rad(360), False)
     .Brush = Paint.Color(Color.Black)
     .Fill
     .LineWidth = 2
     .Translate(coord[0], coord[1])
<FONT Color=gray>' ''Assegnando un valore negativo al parametro della funzione "Rsd()" farà ruotare l'Esagono in senso orario:''</font>
     .MoveTo(points[0].X, points[0].Y)
    .Rotate(Rad(-an))
     For i = 1 To numSides - 1
     .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])
      .LineTo(points[i].X, points[i].Y)
    Next
    .LineTo(points[0].X, points[0].Y)
     .Stroke
     .Stroke
    .End
   End With
   End With
   
   
  End
  End





Versione attuale delle 21:41, 27 lug 2025

Di seguito mostreremo un possibile codice per ruotare un Esagono regolare disegnato in una DrawingArea. [Nota 1]

Private DrawingArea1 As DrawingArea
Private Tmr As Timer
Private Const ScalaRaggio As Float = 0.2     ' Scala del raggio (dimensione dell'esagono)
Private Rotazione As Float                   ' Angolo di rotazione in radianti


Public Sub Form_Open()

 With Me
   .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
   .Arrangement = Arrange.Fill
 End With

 With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
   .Background = Color.Lighter(Color.Yellow)
 End With

 Tmr = New Timer As "Tmr"
 Tmr.Delay = 30             ' circa 33 FPS
 Tmr.Start()

End


Public Sub Tmr_Timer()

Rotazione += Rad(1.5)         ' Rotazione di 1.5° per frame
 If Rotazione >= 2 * Pi Then
   Rotazione -= 2 * Pi
 End If
 DrawingArea1.Refresh()

End


Public Sub DrawingArea1_Draw()

 Dim cx As Float = DrawingArea1.W / 2
 Dim cy As Float = DrawingArea1.H / 2
 Dim r As Float = Min(DrawingArea1.W, DrawingArea1.H) * ScalaRaggio
 Dim numSides As Integer = 6
 Dim angleStep As Float = 2 * Pi / numSides
 Dim points As New PointF[numSides]
 Dim i As Integer

 For i = 0 To numSides - 1
   Dim angle As Float = angleStep * i - Pi / 2 + Rotazione
   points[i] = New PointF(cx + r * Cos(angle), cy + r * Sin(angle))
 Next

 With Paint
   .Brush = Paint.Color(Color.Black)
   .LineWidth = 2

   .MoveTo(points[0].X, points[0].Y)
   For i = 1 To numSides - 1
     .LineTo(points[i].X, points[i].Y)
   Next
   .LineTo(points[0].X, points[0].Y)

   .Stroke
 End With

End



Note

[1] Vedere anche la seguente pagina: Ruotare un pentagono in una DrawingArea