Ruotare una sfera in una DrawingArea

Da Gambas-it.org - Wikipedia.
Versione del 20 lug 2025 alle 05:00 di Vuott (discussione | contributi) (Creata pagina con "Di seguito mostreremo un possibile codice per ottenere l'effetto di una sfera che ruota in senso antiorario. <FONT Color=gray>' ''Costanti per raggio della sfera e numero di...")
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Di seguito mostreremo un possibile codice per ottenere l'effetto di una sfera che ruota in senso antiorario.

' Costanti per raggio della sfera e numero di punti visibili:
Private Const SPHERE_RADIUS As Integer = 100
Private Const NUM_POINTS As Integer = 200

' Angolo di rotazione della sfera (in radianti):
Private angle As Float

' Array contenente i punti 3D generati sulla superficie della sfera
' Ogni elemento è un array [x, y, z] normalizzato:
Private spherePoints As Float[][]


Public Sub Form_Open()

 With Me
   .Title = "Sfera che ruota in senso antiorario"
   .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight)
   .Arrangement = Arrange.Fill
 End With

Timer1.Delay = 16   ' ~60 FPS
Timer1.Start

' Inizializza l'array dei punti:
 spherePoints = New Float[][NUM_POINTS]

 Dim i As Integer
 Dim theta, phi As Float
 Dim x, y, z As Float

' Generazione casuale dei punti distribuiti sulla superficie della sfera:
 For i = 0 To NUM_POINTS - 1
   theta = Rnd(0, 2 * Pi)      ' Angolo longitudinale (orizzontale)
   phi = Acos(Rnd(-1, 1))      ' Angolo latitudinale (verticale)

' Conversione da coordinate sferiche a coordinate cartesiane:
   x = Sin(phi) * Cos(theta)
   y = Cos(phi)
   z = Sin(phi) * Sin(theta)

' Salvataggio del punto normalizzato nell'array:
   spherePoints[i] = [x, y, z]
 Next

End


Public Sub DrawingArea1_Draw()

' Coordinate del centro della sfera nella DrawingArea:
 Dim cx As Float = DrawingArea1.Width / 2
 Dim cy As Float = DrawingArea1.Height / 2
 Dim r As Float = SPHERE_RADIUS

' Variabili per il ciclo:
 Dim i As Integer
 Dim p As Float[]
 Dim x, y, z As Float
 Dim xRot, zRot As Float
 Dim sx, sy As Float

' === Disegno del disco blu di base ===
 Paint.Brush = Paint.Color(Color.RGB(0, 80, 160))
 Paint.Ellipse(cx - r, cy - r, r * 2, r * 2)        ' Cerchio centrato
 Paint.Fill()

' === Disegno dei punti bianchi "ruotati" ===
 For i = 0 To NUM_POINTS - 1

' Estrae il punto dalla lista:
   p = spherePoints[i]
   x = p[0]
   y = p[1]
   z = p[2]

' Rotazione attorno all’asse Y.
' Simula la rotazione della sfera da sinistra a destra:
   xRot = x * Cos(angle) + z * Sin(angle)
   zRot = -x * Sin(angle) + z * Cos(angle)

' Mostra solo i punti "davanti" alla sfera (zRot > 0):
   If zRot > 0 Then

' Proiezione del punto 3D sulla 2D DrawingArea:
     sx = cx + xRot * r
     sy = cy + y * r

' Disegna un piccolo punto bianco (2x2 pixel):
     Paint.Brush = Paint.Color(Color.White)
     Paint.Ellipse(sx - 1, sy - 1, 2, 2)
     Paint.Fill()

   Endif

 Next

' === Disegna il bordo della sfera ===
 Paint.Brush = Paint.Color(&H000000)  ' Nero
 Paint.Ellipse(cx - r, cy - r, r * 2, r * 2)
 Paint.Stroke()

 Paint.End

End