02/03 14:22
nightwolf
Non sono uno che vuole la pappa pronta, ma se il codice è
questo, non potevo mai scriverlo da solo, le miei competenze non sono così avanzate. Perciò se avete la pazienza di spiegarmi ciò che scrivete, ve ne sarei grato.
questo, non potevo mai scriverlo da solo, le miei competenze non sono così avanzate. Perciò se avete la pazienza di spiegarmi ciò che scrivete, ve ne sarei grato.
aaa
02/03 16:09
Carlo
Dovresti fare delle domande...
Il codice ti dice come, con le domande capisci il perché e se sai il perché la prossima volta farai da solo.
L'approcio che ti ho proposto permette il ridimensionamento, quello che hai trovato in C# no, intanto modifica e adatta, poi chiedi.
Il codice ti dice come, con le domande capisci il perché e se sai il perché la prossima volta farai da solo.
L'approcio che ti ho proposto permette il ridimensionamento, quello che hai trovato in C# no, intanto modifica e adatta, poi chiedi.
Ultima modifica effettuata da Carlo 02/03 18:16
in programmazione tutto è permesso
03/03 17:36
nightwolf
buona sera a tutti,
riguardo al codice che hai scritto dovresti spiegarmi proprio la prima parter di codice, perche hai creato una "private bussola" e non hai caricato l immagine di default?
secondo:
che differenza c'è tra le variabili che hai creato con "private" (destinazione, avanzamento, direzione) e quelle create con "dim", non sono sempre variabili?
riguardo al codice che hai scritto dovresti spiegarmi proprio la prima parter di codice, perche hai creato una "private bussola" e non hai caricato l immagine di default?
secondo:
che differenza c'è tra le variabili che hai creato con "private" (destinazione, avanzamento, direzione) e quelle create con "dim", non sono sempre variabili?
aaa
03/03 17:44
nightwolf
sto modificando il codice secondo le mie esigenze, ma non so dove è sbagliato, mi sembra giusto percheè non da erroi, ma a volte si impalla. l ho modificato secondo cui la rotazione avvenga al cambiare del testo di una label e poi in base alle mie modifiche est e west sono invertite, cioè est è a 270 gradi e west è a 90 gradi, e il timer non scatta subito al primo click.
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 If 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 ElseIf Label1.Text = "WEST" Then If avanzamento = 90 Then Exit Sub destinazione = 90 ' sceglie la direzione di rotazione If avanzamento > 90 Then direzione = -2 Else direzione = 2 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 ElseIf Label1.Text = "EST" 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 End If End Sub Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click Label1.Text = "NORD" timer1.Enabled = True End Sub Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click Label1.Text = "EST" timer1.Enabled = True End Sub Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click Label1.Text = "SUD" timer1.Enabled = True End Sub Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click Label1.Text = "WEST" timer1.Enabled = True End Sub End Class
aaa
03/03 18:12
nightwolf
questa modifica perchè?
perchè la direzione avverrà tramite un gps collegato ad darduino, e nel codice attraverso una variabile che leggerà la lettera che arriverà attraverso la serialport la text della label diventarà le direzione, mi spiego meglio.
più o meno è quello che intendo fare.
perchè la direzione avverrà tramite un gps collegato ad darduino, e nel codice attraverso una variabile che leggerà la lettera che arriverà attraverso la serialport la text della label diventarà le direzione, mi spiego meglio.
dim lettera as integer = serialport1.read if lettera ="N" then label1.text="NORD" timer1.enabled=true
più o meno è quello che intendo fare.
aaa
03/03 22:32
Carlo
Postato originariamente da nightwolf:
buona sera a tutti,
riguardo al codice che hai scritto dovresti spiegarmi proprio la prima parter di codice, perche hai creato una "private bussola" e non hai caricato l immagine di default?
secondo:
che differenza c'è tra le variabili che hai creato con "private" (destinazione, avanzamento, direzione) e quelle create con "dim", non sono sempre variabili?
buona sera a tutti,
riguardo al codice che hai scritto dovresti spiegarmi proprio la prima parter di codice, perche hai creato una "private bussola" e non hai caricato l immagine di default?
secondo:
che differenza c'è tra le variabili che hai creato con "private" (destinazione, avanzamento, direzione) e quelle create con "dim", non sono sempre variabili?
con: Dim bussola As Image = New Bitmap("bussola.png" si carica l'immagine dall'HDD. Quando non si specifica il percorso l'immagine viene cercata nel percorso dell'eseguibile.
Se carichi l'immagine come risorsa e poi usi: Dim bussola As Image = New Bitmap(My.Resources.bussola), è la stessa cosa, la scelta sta a te. Come risorsa l'immagine viene inglobata nell'eseguibile e per sostituirla bisogna ricompilare il programma, se invece la includi nella cartella dell'eseguibile la puoi modificare senza ricompilare l'eseguibile, è sufficiente che abbia il nome giusto.
Dim e Private per dichiarare una varibile hanno differenze solo nell'ambito di visibilità tra classi, in questo caso è ininfluente puoi sostituire i Private con Dim.
in programmazione tutto è permesso
03/03 23:03
Carlo
Postato originariamente da nightwolf:
sto modificando il codice secondo le mie esigenze, ma non so dove è sbagliato, mi sembra giusto percheè non da erroi, ma a volte si impalla. l ho modificato secondo cui la rotazione avvenga al cambiare del testo di una label.
sto modificando il codice secondo le mie esigenze, ma non so dove è sbagliato, mi sembra giusto percheè non da erroi, ma a volte si impalla. l ho modificato secondo cui la rotazione avvenga al cambiare del testo di una label.
Così non va bene ma quasi ci sei.
Per fare in modo che la label dove scrivi: Nord, Sud, Est, West, abiliti il Timer, devi attivare l'evento Label1.TextChanged, il codice che hai scritto va lì:
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 = "WEST" 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 = "EST" 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
Togli timer1.Enabled = True nel codice dei button
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
e togli gli if dentro al codice di Timer1
Private Sub timer1_Tick(sender As Object, 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
Come funziona il codice così modificato?
Quando premi un button vene modificato il testo in Label1, si scatena l'evento: Label1.TextChanged ed il codice relativo viene eseguito, gli if impostano i valori corretti e poi si attiva il timer che richiama la routine rotate() ciclicamente, finquando non si è raggiunta la desinazione.
Come avevi fatto tu, la scelta dei valori venivano ripetutamente reinizializzati ogni volta che il codice in Timer1 veniva eseguito.
Ricorda che Timer1 riesegue il codice ogni volta che sono trascorsi i millisecondi impostati in Interval.
Ultima modifica effettuata da Carlo 03/03 23:35
in programmazione tutto è permesso