Ruotare una piramide 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
Riga 1: Riga 1:
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.
Mostriamo un codice per disegnare e far ruotare una piramide intorno al suo asse Y.
<BR>La piramide è formata da tre facce di triangoli isosceli e la base con un triangolo equilatero.
 
Nell'esempio che segue sarà possibile aumentare o diminuire la dimensione del disegno dellPiramide, cliccando rispettivamente sui tasti "+" e "-" della tastiera.  
  <FONT Color=gray>' ''Angolo corrente della rotazione attorno all'asse Y:''</font>
  <FONT Color=gray>' ''Angolo corrente della rotazione attorno all'asse Y:''</font>
  Private angle As Float
  Private angle As Float
  <FONT Color=gray>' ''Vertici 3D della piramide: array di 4 Float[]:''</font>
  <FONT Color=gray>' ''Vertici 3D della piramide: array di 4 Float[]:''</font>
  Private Vertices[4] As Float[]
  Private Vertices[4] As Float[]
  <FONT Color=gray>' ''Coordinate proiettate 2D per il disegno:''</font>
  <FONT Color=gray>' ''Coordinate proiettate 2D per il disegno:''</font>
  Private Projected[4] As Point
  Private Projected[4] As Point
<FONT Color=gray>' ''Fattore di zoom (valore più alto = oggetto più grande):</font>
Private Zoom As Float = 300
   
   
   
   
Riga 54: Riga 57:
   Dim cx As Integer = DrawingArea1.Width / 2  <FONT Color=gray>' ''centro X della DrawingArea''</font>
   Dim cx As Integer = DrawingArea1.Width / 2  <FONT Color=gray>' ''centro X della DrawingArea''</font>
   Dim cy As Integer = DrawingArea1.Height / 2  <FONT Color=gray>' ''centro Y''</font>
   Dim cy As Integer = DrawingArea1.Height / 2  <FONT Color=gray>' ''centro Y''</font>
   Dim scale As Float = 300                    <FONT Color=gray>' ''fattore di scala prospettico''</font>
   Dim scale As Float = Zoom                    <FONT Color=gray>' ''fattore variabile di scala prospettico''</font>
   Dim i As Integer
   Dim i As Integer
   Dim v As Float[]
   Dim v As Float[]
Riga 104: Riga 107:
   Paint.LineTo(Projected[a].x, Projected[a].y)
   Paint.LineTo(Projected[a].x, Projected[a].y)
   Paint.Stroke
   Paint.Stroke
End
Public Sub Form_KeyPress()  <FONT Color=gray>' ''Gestione della tastiera per controllare lo zoom''</font>
  Select Case Key.Code
    Case Key["+"]
      Zoom = Min(Zoom + 25, 1000)
    Case Key["-"]
      Zoom = Max(Zoom - 25, 25)
  End Select
  DrawingArea1.Refresh
   
   
  End
  End

Versione delle 13:25, 21 lug 2025

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.

Nell'esempio che segue sarà possibile aumentare o diminuire la dimensione del disegno dellPiramide, cliccando rispettivamente sui tasti "+" e "-" della tastiera.

' 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
' Fattore di zoom (valore più alto = oggetto più grande):
Private Zoom As Float = 300


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 = Zoom                    ' fattore variabile 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.LineWidth = 1
 Paint.Brush = Paint.Color(Color.Black)   ' colore dei bordi

' 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


Public Sub Form_KeyPress()   ' Gestione della tastiera per controllare lo zoom

 Select Case Key.Code
   Case Key["+"]
     Zoom = Min(Zoom + 25, 1000)
   Case Key["-"]
     Zoom = Max(Zoom - 25, 25)
 End Select

 DrawingArea1.Refresh

End