Ruotare un rombo in una DrawingArea: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
Vai alla navigazione Vai alla ricerca
Nessun oggetto della modifica
Nessun oggetto della modifica
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Di seguito mostreremo un possibile codice per ruotare un Rombo disegnato in una ''DrawingArea''.
Di seguito mostreremo un possibile codice per ruotare un Rombo disegnato in una ''DrawingArea''.
E' possibile variare la dimensione del Rombo, modificando il raggio della circonferenza, sulla quale i suoi 4 vertici insistono.
La rotazione del Rombo 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 DrawingArea1 As DrawingArea
  Private Const <FONT Color=#B22222>RAGGIO</font> As Single = 100.0
Private Tmr As Timer
  Private Const ROMBO As Byte = 4
  Private Const ScalaRaggio As Float = 0.2    <FONT Color=gray>' ''Scala del raggio (dimensione del Rombo)''</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 18: 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 DrawingArea1_Draw()
   
   
   Dim gradi As Single[] = [0.0, 90.0, 180.0, 270.0]
   Dim cx As Float = DrawingArea1.W / 2
   For t As Byte = 0 To ROMBO - 1
  Dim cy As Float = DrawingArea1.H / 2
    pol.Push(RAGGIO * Cos(Rad(gradi[t])))
  Dim w As Float = DrawingArea1.W * 0.4
    pol.Push(RAGGIO * Sin(Rad(gradi[t])))
   Dim h As Float = DrawingArea1.H * 0.3
   Next
   Dim r As Float = 5
   
   
<FONT Color=gray>' ''Il risultato di ((25 * RAGGIO) / 100) aggiusta in orizzontale il punto di rotazione del Rombo:''</font>
   Dim points As New PointF[4]
   xs = (coord[0] + coord[0] + pol[2] + coord[0] + Abs(pol[4]) + coord[0] - Abs(pol[6])) / ROMBO - <FONT Color=darkorange>((25 * RAGGIO) / 100)</font>
   Dim i As Integer
   ys = (coord[1] + coord[1] + pol[3] + coord[1] + pol[5] + coord[1] + pol[7]) / ROMBO
   
   
End
  Dim basePoints As New PointF[4]
  basePoints[0] = New PointF(0, -h / 2)
  basePoints[1] = New PointF(w / 2, 0)
  basePoints[2] = New PointF(0, h / 2)
  basePoints[3] = New PointF(-w / 2, 0)
   
   
Public Sub DrawingArea1_MouseUp()
  For i = 0 To 3
    Dim xRot As Float = basePoints[i].X * Cos(Rotazione) - basePoints[i].Y * Sin(Rotazione)
    Dim yRot As Float = basePoints[i].X * Sin(Rotazione) + basePoints[i].Y * Cos(Rotazione)
    points[i] = New PointF(cx + xRot, cy + yRot)
  Next
   
   
   While Object.IsValid(DrawingArea1)
   With Paint
    an += ANGOLO
<FONT Color=gray>' ''Disegna il rombo:''</font>
    DrawingArea1.Refresh
  .Brush = Paint.Color(Color.Black)
    Wait 0.01
   .LineWidth = 2
   Wend
   
   
End
  .MoveTo(points[0].X, points[0].Y)
  For i = 1 To 3
Public Sub DrawingArea1_Draw()
    .LineTo(points[i].X, points[i].Y)
  Next
  .LineTo(points[0].X, points[0].Y)
  .Stroke
   
   
   With Paint
<FONT Color=gray>' ''Disegna il punto nero al centro:''</font>
    .Arc(coord[0], coord[1], 2, Rad(0), Rad(360), False)
   .Ellipse(cx - r, cy - r, 2 * r, 2 * r)
    .Fill
  .Fill
    .Translate(coord[0], coord[1])
    .Rotate(Rad(-an))
    .Polygon([((coord[0] + pol[0]) - xs) - 50, (coord[1] + pol[1]) - ys, (coord[0] + pol[2]) - xs, (coord[1] + pol[3]) - ys, ((coord[0] + pol[4]) - xs) + 50, (coord[1] + pol[5]) - ys, (coord[0] + pol[6]) - xs, (coord[1] + pol[7]) - ys])
    .Stroke
    .End
   End With
   End With
   
   
  End
  End

Versione attuale delle 18:48, 10 ago 2025

Di seguito mostreremo un possibile codice per ruotare un Rombo disegnato in una DrawingArea.

Private DrawingArea1 As DrawingArea
Private Tmr As Timer
Private Const ScalaRaggio As Float = 0.2     ' Scala del raggio (dimensione del Rombo)
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 DrawingArea1_Draw()

 Dim cx As Float = DrawingArea1.W / 2
 Dim cy As Float = DrawingArea1.H / 2
 Dim w As Float = DrawingArea1.W * 0.4
 Dim h As Float = DrawingArea1.H * 0.3
 Dim r As Float = 5

 Dim points As New PointF[4]
 Dim i As Integer

 Dim basePoints As New PointF[4]
 basePoints[0] = New PointF(0, -h / 2)
 basePoints[1] = New PointF(w / 2, 0)
 basePoints[2] = New PointF(0, h / 2)
 basePoints[3] = New PointF(-w / 2, 0)

 For i = 0 To 3
   Dim xRot As Float = basePoints[i].X * Cos(Rotazione) - basePoints[i].Y * Sin(Rotazione)
   Dim yRot As Float = basePoints[i].X * Sin(Rotazione) + basePoints[i].Y * Cos(Rotazione)
   points[i] = New PointF(cx + xRot, cy + yRot)
 Next

 With Paint
' Disegna il rombo:
 .Brush = Paint.Color(Color.Black)
 .LineWidth = 2

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

' Disegna il punto nero al centro:
 .Ellipse(cx - r, cy - r, 2 * r, 2 * r)
 .Fill
 End With

End