Ruotare una piramide in una DrawingArea: differenze tra le versioni
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: | ||
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. | |||
Private DrawingArea1 As DrawingArea | |||
Private Timer1 As Timer | |||
<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 18: | Riga 23: | ||
End With | End With | ||
Timer1.Delay = 16 | With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1" | ||
.Background = Color.White | |||
End With | |||
With Timer1 = New Timer As "Timer1" | |||
.Delay = 16 | |||
.Start | |||
End With | |||
<FONT Color=gray>' ''Inizializza i punti 2D (Projected) come oggetti Point:''</font> | <FONT Color=gray>' ''Inizializza i punti 2D (Projected) come oggetti Point:''</font> | ||
| Riga 54: | Riga 65: | ||
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 = | 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 84: | Riga 95: | ||
<FONT Color=gray>' ''Disegna i contorni della base triangolare:''</font> | <FONT Color=gray>' ''Disegna i contorni della base triangolare:''</font> | ||
DrawOutline(1, 2, 3) | DrawOutline(1, 2, 3) | ||
End | End | ||
| Riga 104: | Riga 113: | ||
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 attuale delle 18:53, 10 ago 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.
Private DrawingArea1 As DrawingArea
Private Timer1 As Timer
' 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
With DrawingArea1 = New DrawingArea(Me) As "DrawingArea1"
.Background = Color.White
End With
With Timer1 = New Timer As "Timer1"
.Delay = 16
.Start
End With
' 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)
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