Ruotare una piramide in una DrawingArea
Vai alla navigazione
Vai alla ricerca
Mostriamo un codice per disegnare e far ruotare una piramide intorno al suo asse Y. La piramide è formata da tre facce di triangoli isosceli e la base con un triangolo equilatero.
' Angolo corrente della rotazione attorno all'asse Y: Private angle As Float ' Vertici 3D della piramide: array di 4 Float[]: Private Vertices[4] As Float[] ' Coordinate proiettate 2D per il disegno: Private Projected[4] As Point Public Sub Form_Open() With Me .Title = "Piramide che ruota intorno al suo asse Y" .Move(0, 0, Screen.AvailableWidth, Screen.AvailableHeight) .Arrangement = Arrange.Fill End With Timer1.Delay = 16 ' ~60 FPS Timer1.Start ' Inizializza i punti 2D (Projected) come oggetti Point: For i As Integer = 0 To 3 Projected[i] = New Point Next ' Costruzione della piramide: ' Punta in alto, base triangolare equilatera nel piano XZ: Dim r As Float = 100.0 ' raggio della base Dim h As Float = 100.0 ' altezza della piramide ' Vertice 0: punta: Vertices[0] = [0.0, -h, 0.0] ' Vertici 1-3: base triangolare equilatera (angoli 0°, 120°, 240°): Vertices[1] = [Cos(0) * r, h, Sin(0) * r] Vertices[2] = [Cos(2 * Pi / 3) * r, h, Sin(2 * Pi / 3) * r] Vertices[3] = [Cos(4 * Pi / 3) * r, h, Sin(4 * Pi / 3) * r] End Public Sub Timer1_Timer() angle += 0.03 DrawingArea1.Refresh End Public Sub DrawingArea1_Draw() Dim cx As Integer = DrawingArea1.Width / 2 ' centro X della DrawingArea Dim cy As Integer = DrawingArea1.Height / 2 ' centro Y Dim scale As Float = 300 ' fattore di scala prospettico Dim i As Integer Dim v As Float[] Dim x, y, z As Float ' Trasforma e proietta i vertici 3D → 2D: For i = 0 To 3 v = Vertices[i] ' Rotazione sull'asse Y: x = v[0] * Cos(angle) + v[2] * Sin(angle) y = v[1] z = -v[0] * Sin(angle) + v[2] * Cos(angle) + 400 ' traslazione Z per "allontanare" l'oggetto ' Proiezione prospettica semplice: Projected[i].x = cx + (x / z) * scale Projected[i].y = cy + (y / z) * scale Next ' Inizio del disegno: Paint.Begin(DrawingArea1) Paint.LineWidth = 2 Paint.Foreground = Color.Black ' colore dei bordi Paint.Brush = Null ' nessun riempimento ' Disegna i contorni delle 3 facce laterali: DrawOutline(0, 1, 2) DrawOutline(0, 2, 3) DrawOutline(0, 3, 1) ' Disegna i contorni della base triangolare: DrawOutline(1, 2, 3) Paint.End End Private Procedure DrawOutline(a As Integer, b As Integer, c As Integer) ' Disegna il contorno di un triangolo specificato dai 3 vertici ' Disegna ogni lato separatamente per evitare giunzioni grafiche indesiderate: Paint.MoveTo(Projected[a].x, Projected[a].y) Paint.LineTo(Projected[b].x, Projected[b].y) Paint.Stroke Paint.MoveTo(Projected[b].x, Projected[b].y) Paint.LineTo(Projected[c].x, Projected[c].y) Paint.Stroke Paint.MoveTo(Projected[c].x, Projected[c].y) Paint.LineTo(Projected[a].x, Projected[a].y) Paint.Stroke End