Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - creare una bussola
Forum - C# / VB.NET - creare una bussola - Pagina 2

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 15:22
Sabato, 02/03/2024
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.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:09
Sabato, 02/03/2024
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.

Ultima modifica effettuata da Carlo il 02/03/2024 alle 19:16


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 18:36
Domenica, 03/03/2024
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?


PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 18:44
Domenica, 03/03/2024
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.
Codice sorgente - presumibilmente VB.NET

  1. Imports System.Drawing.Drawing2D
  2.  
  3. Partial Public Class Form1
  4.  
  5.     Private bussola As Image = New Bitmap("bussola.png") ' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
  6.     Private destinazione As Integer
  7.     Private avanzamento As Integer
  8.     Private direzione As Integer
  9.  
  10.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  11.         rotate(0) ' primo disegno
  12.  
  13.     End Sub
  14.  
  15.     Private Sub rotate(ByVal valoreGradi As Integer) ' aggiorna rotazione
  16.         Dim rot0 As Image = DirectCast(bussola.Clone(), Image) ' partenza sempre dall'originale a zero gradi
  17.         Dim g As Graphics = Graphics.FromImage(rot0) ' layer grafico di lavoro
  18.         ' centro immagine
  19.         Dim centerX As Integer = rot0.Width \ 2
  20.         Dim centerY As Integer = rot0.Height \ 2
  21.         ' Crea una matrice di trasformazione per ruotare l'immagine
  22.         Dim matrix As New Matrix()
  23.         matrix.Translate(centerX, centerY) ' coordinate di riferimento al centro
  24.         matrix.Rotate(avanzamento) ' rotazione
  25.         ' Applica la trasformazione all'immagine
  26.         g.Transform = matrix
  27.         ' Disegna l'immagine ruotata nella bitmap centrata
  28.         g.DrawImage(rot0, -centerX, -centerY)
  29.         Me.BackgroundImage = rot0 ' la bitmap nel form
  30.         Me.Refresh() ' aggiorna il form
  31.     End Sub
  32.  
  33.     Private Sub timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles timer1.Tick
  34.         avanzamento += direzione
  35.         avanzamento = avanzamento Mod 360 ' azzera a 360°
  36.         rotate(avanzamento)
  37.  
  38.         If avanzamento = destinazione Then
  39.             timer1.Enabled = False
  40.         End If
  41.         If Label1.Text = "NORD" Then
  42.             If avanzamento = 0 Then Exit Sub
  43.             destinazione = 0
  44.             ' sceglie la direzione di rotazione
  45.             If avanzamento < 180 Then direzione = -2 Else direzione = 2
  46.         ElseIf Label1.Text = "WEST" Then
  47.             If avanzamento = 90 Then Exit Sub
  48.             destinazione = 90
  49.             ' sceglie la direzione di rotazione
  50.             If avanzamento > 90 Then direzione = -2 Else direzione = 2
  51.         ElseIf Label1.Text = "SUD" Then
  52.             If avanzamento = 180 Then Exit Sub
  53.             destinazione = 180
  54.             ' sceglie la direzione di rotazione
  55.             If avanzamento > 180 Then direzione = -2 Else direzione = 2
  56.         ElseIf Label1.Text = "EST" Then
  57.             If avanzamento = 270 Then Exit Sub
  58.             destinazione = 270
  59.             ' normalizza
  60.             If avanzamento = 0 Then avanzamento = 360
  61.             ' sceglie la direzione di rotazione
  62.             If avanzamento > 180 Then direzione = -2 Else direzione = 2
  63.         End If
  64.  
  65.     End Sub
  66.  
  67.     Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click
  68.         Label1.Text = "NORD"
  69.         timer1.Enabled = True
  70.     End Sub
  71.  
  72.     Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click
  73.         Label1.Text = "EST"
  74.         timer1.Enabled = True
  75.     End Sub
  76.  
  77.     Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click
  78.         Label1.Text = "SUD"
  79.         timer1.Enabled = True
  80.     End Sub
  81.  
  82.     Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click
  83.         Label1.Text = "WEST"
  84.         timer1.Enabled = True
  85.     End Sub
  86.  
  87. End Class




PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 19:12
Domenica, 03/03/2024
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.
Codice sorgente - presumibilmente VB.NET

  1. dim lettera as integer = serialport1.read
  2. if lettera ="N" then
  3. label1.text="NORD"
  4. timer1.enabled=true



più o meno è quello che intendo fare.

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 23:32
Domenica, 03/03/2024
Testo quotato

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?




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
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 0:03
Lunedì, 04/03/2024
Testo quotato

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.



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ì:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Label1_TextChanged(sender As Object, e As EventArgs) Handles Label1.TextChanged
  2.         If Label1.Text = "NORD" Then
  3.             If avanzamento = 0 Then Exit Sub
  4.             destinazione = 0
  5.             ' sceglie la direzione di rotazione
  6.             If avanzamento < 180 Then direzione = -2 Else direzione = 2
  7.             timer1.Enabled = True
  8.         ElseIf Label1.Text = "WEST" Then
  9.             If avanzamento = 90 Then Exit Sub
  10.             destinazione = 90
  11.             ' sceglie la direzione di rotazione
  12.             If avanzamento > 90 Then direzione = -2 Else direzione = 2
  13.             timer1.Enabled = True
  14.         ElseIf Label1.Text = "SUD" Then
  15.             If avanzamento = 180 Then Exit Sub
  16.             destinazione = 180
  17.             ' sceglie la direzione di rotazione
  18.             If avanzamento > 180 Then direzione = -2 Else direzione = 2
  19.             timer1.Enabled = True
  20.         ElseIf Label1.Text = "EST" Then
  21.             If avanzamento = 270 Then Exit Sub
  22.             destinazione = 270
  23.             ' normalizza
  24.             If avanzamento = 0 Then avanzamento = 360
  25.             ' sceglie la direzione di rotazione
  26.             If avanzamento > 180 Then direzione = -2 Else direzione = 2
  27.             timer1.Enabled = True
  28.         End If
  29.     End Sub



Togli timer1.Enabled = True nel codice dei button

Codice sorgente - presumibilmente VB.NET

  1. Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click
  2.         Label1.Text = "NORD"
  3.     End Sub
  4.  
  5.     Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click
  6.         Label1.Text = "EST"
  7.     End Sub
  8.  
  9.     Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click
  10.         Label1.Text = "SUD"
  11.     End Sub
  12.  
  13.     Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click
  14.         Label1.Text = "WEST"
  15.     End Sub



e togli gli if dentro al codice di Timer1

Codice sorgente - presumibilmente VB.NET

  1. Private Sub timer1_Tick(sender As Object, e As EventArgs) Handles timer1.Tick
  2.           avanzamento += direzione
  3.         avanzamento = avanzamento Mod 360 ' azzera a 360°
  4.         rotate(avanzamento)
  5.  
  6.         If avanzamento = destinazione Then timer1.Enabled = False
  7. 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 il 04/03/2024 alle 0:35


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 0:17
Lunedì, 04/03/2024
Testo quotato

Postato originariamente da 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.
Codice sorgente - presumibilmente VB.NET

  1. dim lettera as integer = serialport1.read
  2. if lettera ="N" then
  3. label1.text="NORD"
  4. timer1.enabled=true



più o meno è quello che intendo fare.


Chiaro però non devi mettere timer1.enabled=true, perchè come modifichi il testo in label1, tutto procede come spiegato prima. :asd:


in programmazione tutto è permesso
PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo