Ruotare una sfera in una DrawingArea
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