Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
grazie mille x la spiegazione. questo è l intero codice, e non so perchè se est è a 90 gradi e west è a 270 gradi, nell esecuzione i 2 punti sono invertiti. il codice funziona al cambiare della test della label, l unico inconveniente è inversione dei 2 punti cardinali.
Codice sorgente - presumibilmente VB.NET
Imports System.Drawing.Drawing2D
Partial PublicClass Form1
Private bussola As Image =New Bitmap("bussola.png")' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
Private destinazione AsInteger
Private avanzamento AsInteger
Private direzione AsInteger
PrivateSub Form1_Load(sender AsObject, e As EventArgs)HandlesMyBase.Load
Postato originariamente da nightwolf: grazie mille x la spiegazione. questo è l intero codice, e non so perchè se est è a 90 gradi e west è a 270 gradi, nell esecuzione i 2 punti sono invertiti. il codice funziona al cambiare della test della label, l unico inconveniente è inversione dei 2 punti cardinali.
Ho copiato e incollato il tuo codice e non vedo inversioni, quando nella label c'è scritto EST il nord va a est (90°) e quando c'é scritto WEST il nord va a ovest (270°)
In allegato foto risultante dal tuo codice, dimmi se è come vorresti.
Se invece vuoi che quando scrivi EST o WEST, si posizionino in alto al centro era giusto il tuo codice precedente.
Se ti interessa ti posso postare l'esempio con l'evento paint e che non usa una bitmap in ram per la rotazione, la rotazione è più efficiente, sono solo 4 righe ma al ridimensionamento del form l'immagine resta di dimensione fissa.
esatto, quando ce scritto est il nord va a 90 gradi e quando c'è scritto west il nord va a 270, di conseguenza come avviene anche dall immagine che hai postato la label c'è scritto est e la bussola in alto indica west, così come quando clicchi west la bussola in alto indica est.
grazie, se mi scrivi il codice in paint, anche perchè la bussola restera fissa e non verra ridimensionata, devo ancora decidere dove posizionarla nella schermata principale del form, anche perchè lo spazio è poco
la bussola andrà in una posizione predefinita e perciò dovrò far si che nell evento load del form la bussola si caricherà ina una determinata posizione e dimensione, a meno che non si carica in una pictures box gia impostata. posto un immagine dove dovrà andare.
Se devi posizionare la bussola, usare una picturebox va benissimo, il codice nel paint è sempre lo stesso.
Ricorda che l'immagine con il codice che ti propongo viene disegnata della stessa dimensione del file, si può anche scalare ma te lo sconsiglio perché hai dettagli fini nella bussola e le scalature peggiorano l'aspetto dell'immagine, anche l'antialias non ti salva.
Ti consiglio di disegnare l'immagine bussola.png della giusta dimensione partendo dalla tua originale, magari scalandola con Photoshop che lo fa nel modo migliore possibile.
Ecco il tuo codice con il paint in una picturebox:
Codice sorgente - presumibilmente VB.NET
PublicClass Form1
Dim bussola As Image =New Bitmap("bussola.png")' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
Dim destinazione AsInteger
Dim avanzamento AsInteger
Dim direzione AsInteger
Dim cX AsInteger= bussola.Width\ 2
Dim cY AsInteger= bussola.Height\ 2
Dim dX AsInteger= bussola.Width
Dim dY AsInteger= bussola.Height
Dim vel AsInteger=2' velocità, valori supportati 1, 2, 3, 5, 6, 9, 10 (divisibili per 90)
PrivateSub butNord_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butNord.Click
Label1.Text="NORD"
EndSub
PrivateSub butEst_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butEst.Click
Label1.Text="EST"
EndSub
PrivateSub butSud_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butSud.Click
Label1.Text="SUD"
EndSub
PrivateSub butWest_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butWest.Click
Label1.Text="WEST"
EndSub
PrivateSub timer1_Tick(sender AsObject, e As EventArgs)Handles timer1.Tick
avanzamento += direzione
avanzamento = avanzamento Mod360' azzera a 360°
PictureBox1.Invalidate()' scatena il paint
If avanzamento = destinazione Then timer1.Enabled=False
EndSub
PrivateSub Label1_TextChanged(sender AsObject, e As EventArgs)Handles Label1.TextChanged
If Label1.Text="NORD"Then
If avanzamento = 0 ThenExitSub
destinazione =0
' sceglie la direzione di rotazione
If avanzamento < 180 Then direzione =-vel Else direzione = vel
timer1.Enabled=True
ElseIf Label1.Text="EST"Then' o WEST
If avanzamento = 90 ThenExitSub
destinazione =90
' sceglie la direzione di rotazione
If avanzamento > 90 Then direzione =-vel Else direzione = vel
timer1.Enabled=True
ElseIf Label1.Text="SUD"Then
If avanzamento = 180 ThenExitSub
destinazione =180
' sceglie la direzione di rotazione
If avanzamento > 180 Then direzione =-vel Else direzione = vel
timer1.Enabled=True
ElseIf Label1.Text="WEST"Then' o EST
If avanzamento = 270 ThenExitSub
destinazione =270
' normalizza
If avanzamento = 0 Then avanzamento =360' forza la rotazione antioraria se si è a nord
' sceglie la direzione di rotazione
If avanzamento > 180 Then direzione =-vel Else direzione = vel
timer1.Enabled=True
EndIf
EndSub
PrivateSub PictureBox1_Paint(sender AsObject, e As PaintEventArgs)Handles PictureBox1.Paint
e.Graphics.TranslateTransform(cX, cY)' posizione centro
e.Graphics.RotateTransform(avanzamento)' rotazione in gradi
grazie mille x il codice, però rimane sempre il problema dei 2 punti cardinali invertiti, non so è un problema di visual basic ma a me risultano invertiti, allego le foto