03/03 23:31
Carlo
Postato originariamente da nightwolf:
in base alle mie modifiche est e west sono invertite, cioè est è a 270 gradi e west è a 90 gradi
in base alle mie modifiche est e west sono invertite, cioè est è a 270 gradi e west è a 90 gradi
Sul tuo codice è invertito, lo hai fatto di proposito?
ElseIf Label1.Text = "WEST" Then If avanzamento = 90 Then Exit Sub destinazione = 90 ' ovest va a 90 gradi....
ElseIf Label1.Text = "EST" Then If avanzamento = 270 Then Exit Sub destinazione = 270 ' est va a 270 gradi....
Ultima modifica effettuata da Carlo 03/03 23:39
in programmazione tutto è permesso
04/03 11:38
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.
Imports System.Drawing.Drawing2D Partial Public Class Form1 Private bussola As Image = New Bitmap("bussola.png") ' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile Private destinazione As Integer Private avanzamento As Integer Private direzione As Integer Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load rotate(0) ' primo disegno End Sub Private Sub rotate(ByVal valoreGradi As Integer) ' aggiorna rotazione Dim rot0 As Image = DirectCast(bussola.Clone(), Image) ' partenza sempre dall'originale a zero gradi Dim g As Graphics = Graphics.FromImage(rot0) ' layer grafico di lavoro ' centro immagine Dim centerX As Integer = rot0.Width \ 2 Dim centerY As Integer = rot0.Height \ 2 ' Crea una matrice di trasformazione per ruotare l'immagine Dim matrix As New Matrix() matrix.Translate(centerX, centerY) ' coordinate di riferimento al centro matrix.Rotate(avanzamento) ' rotazione ' Applica la trasformazione all'immagine g.Transform = matrix ' Disegna l'immagine ruotata nella bitmap centrata g.DrawImage(rot0, -centerX, -centerY) Me.BackgroundImage = rot0 ' la bitmap nel form Me.Refresh() ' aggiorna il form End Sub Private Sub timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles timer1.Tick avanzamento += direzione avanzamento = avanzamento Mod 360 ' azzera a 360° rotate(avanzamento) If avanzamento = destinazione Then timer1.Enabled = False End Sub Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click Label1.Text = "NORD" End Sub Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click Label1.Text = "EST" End Sub Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click Label1.Text = "SUD" End Sub Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click Label1.Text = "WEST" End Sub Private Sub Label1_TextChanged(sender As Object, e As EventArgs) Handles Label1.TextChanged If Label1.Text = "NORD" Then If avanzamento = 0 Then Exit Sub destinazione = 0 ' sceglie la direzione di rotazione If avanzamento < 180 Then direzione = -2 Else direzione = 2 timer1.Enabled = True ElseIf Label1.Text = "EST" Then If avanzamento = 90 Then Exit Sub destinazione = 90 ' sceglie la direzione di rotazione If avanzamento > 90 Then direzione = -2 Else direzione = 2 timer1.Enabled = True ElseIf Label1.Text = "SUD" Then If avanzamento = 180 Then Exit Sub destinazione = 180 ' sceglie la direzione di rotazione If avanzamento > 180 Then direzione = -2 Else direzione = 2 timer1.Enabled = True ElseIf Label1.Text = "WEST" Then If avanzamento = 270 Then Exit Sub destinazione = 270 ' normalizza If avanzamento = 0 Then avanzamento = 360 ' sceglie la direzione di rotazione If avanzamento > 180 Then direzione = -2 Else direzione = 2 timer1.Enabled = True End If End Sub End Class
aaa
04/03 11:57
Carlo
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.
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.
Ultima modifica effettuata da Carlo 04/03 12:32
in programmazione tutto è permesso
04/03 13:31
nightwolf
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.
aaa
04/03 13:39
nightwolf
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
aaa
04/03 18:20
nightwolf
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.
aaa
04/03 20:03
Carlo
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:
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:
Public Class Form1 Dim bussola As Image = New Bitmap("bussola.png") ' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile Dim destinazione As Integer Dim avanzamento As Integer Dim direzione As Integer Dim cX As Integer = bussola.Width \ 2 Dim cY As Integer = bussola.Height \ 2 Dim dX As Integer = bussola.Width Dim dY As Integer = bussola.Height Dim vel As Integer = 2 ' velocità, valori supportati 1, 2, 3, 5, 6, 9, 10 (divisibili per 90) Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click Label1.Text = "NORD" End Sub Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click Label1.Text = "EST" End Sub Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click Label1.Text = "SUD" End Sub Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click Label1.Text = "WEST" End Sub Private Sub timer1_Tick(sender As Object, e As EventArgs) Handles timer1.Tick avanzamento += direzione avanzamento = avanzamento Mod 360 ' azzera a 360° PictureBox1.Invalidate() ' scatena il paint If avanzamento = destinazione Then timer1.Enabled = False End Sub Private Sub Label1_TextChanged(sender As Object, e As EventArgs) Handles Label1.TextChanged If Label1.Text = "NORD" Then If avanzamento = 0 Then Exit Sub 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 Then Exit Sub 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 Then Exit Sub 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 Then Exit Sub 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 End If End Sub Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint e.Graphics.TranslateTransform(cX, cY) ' posizione centro e.Graphics.RotateTransform(avanzamento) ' rotazione in gradi e.Graphics.DrawImage(bussola, -cX, -cY, dX, dY) ' dimensione 100% End Sub End Class
Ultima modifica effettuata da Carlo 04/03 21:51
in programmazione tutto è permesso