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
 
(2 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[]
Private c As Integer[] = [Color.Blue, Color.Green, Color.Yellow, Color.Red]
Private f As Float[] = [0, 0.34, 0.67, 1]
   
   
   
   
Riga 20: 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()
  Public Sub DrawingArea1_Draw()
   
   
   coord = [DrawingArea1.W / 2, DrawingArea1.H / 2]
   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 gradi As Single[] = [0.0, 90.0, 180.0, 270.0]
   Dim points As New PointF[4]
   For t As Byte = 0 To ROMBO - 1
   Dim i As Integer
    pol.Push(RAGGIO * Cos(Rad(gradi[t])))
    pol.Push(RAGGIO * Sin(Rad(gradi[t])))
  Next
   
   
<FONT Color=gray>' ''Il risultato di ((25 * RAGGIO) / 100) aggiusta in orizzontale il punto di rotazione del Rombo:''</font>
  Dim basePoints 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>
  basePoints[0] = New PointF(0, -h / 2)
   ys = (coord[1] + coord[1] + pol[3] + coord[1] + pol[5] + coord[1] + pol[7]) / ROMBO
   basePoints[1] = New PointF(w / 2, 0)
  basePoints[2] = New PointF(0, h / 2)
   basePoints[3] = New PointF(-w / 2, 0)
   
   
End
  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
<FONT Color=gray>' ''Disegna il rombo:''</font>
  .Brush = Paint.Color(Color.Black)
  .LineWidth = 2
   
   
Public Sub DrawingArea1_MouseUp()
  .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
   
   
  While Object.IsValid(DrawingArea1)
<FONT Color=gray>' ''Disegna il punto nero al centro:''</font>
    an += ANGOLO
   .Ellipse(cx - r, cy - r, 2 * r, 2 * r)
    DrawingArea1.Refresh
  .Fill
    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])
    .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