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 3

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


Messaggi: 1364
Iscritto: 29/01/2018

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

Postato originariamente da nightwolf:
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?

Codice sorgente - presumibilmente VB.NET

  1. ElseIf Label1.Text = "WEST" Then
  2.             If avanzamento = 90 Then Exit Sub
  3.             destinazione = 90 ' ovest va a 90 gradi....


Codice sorgente - presumibilmente VB.NET

  1. ElseIf Label1.Text = "EST" Then
  2.             If avanzamento = 270 Then Exit Sub
  3.             destinazione = 270 ' est va a 270 gradi....


Ultima modifica effettuata da Carlo il 04/03/2024 alle 0:39


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


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 12:38
Lunedì, 04/03/2024
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

  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 timer1.Enabled = False
  39.     End Sub
  40.  
  41.     Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click
  42.         Label1.Text = "NORD"
  43.  
  44.     End Sub
  45.  
  46.     Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click
  47.         Label1.Text = "EST"
  48.  
  49.     End Sub
  50.  
  51.     Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click
  52.         Label1.Text = "SUD"
  53.  
  54.     End Sub
  55.  
  56.     Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click
  57.         Label1.Text = "WEST"
  58.  
  59.     End Sub
  60.  
  61.     Private Sub Label1_TextChanged(sender As Object, e As EventArgs) Handles Label1.TextChanged
  62.         If Label1.Text = "NORD" Then
  63.             If avanzamento = 0 Then Exit Sub
  64.             destinazione = 0
  65.             ' sceglie la direzione di rotazione
  66.             If avanzamento < 180 Then direzione = -2 Else direzione = 2
  67.             timer1.Enabled = True
  68.         ElseIf Label1.Text = "EST" Then
  69.             If avanzamento = 90 Then Exit Sub
  70.             destinazione = 90
  71.             ' sceglie la direzione di rotazione
  72.             If avanzamento > 90 Then direzione = -2 Else direzione = 2
  73.             timer1.Enabled = True
  74.         ElseIf Label1.Text = "SUD" Then
  75.             If avanzamento = 180 Then Exit Sub
  76.             destinazione = 180
  77.             ' sceglie la direzione di rotazione
  78.             If avanzamento > 180 Then direzione = -2 Else direzione = 2
  79.             timer1.Enabled = True
  80.         ElseIf Label1.Text = "WEST" Then
  81.             If avanzamento = 270 Then Exit Sub
  82.             destinazione = 270
  83.             ' normalizza
  84.             If avanzamento = 0 Then avanzamento = 360
  85.             ' sceglie la direzione di rotazione
  86.             If avanzamento > 180 Then direzione = -2 Else direzione = 2
  87.             timer1.Enabled = True
  88.         End If
  89.     End Sub
  90.  
  91. End Class



PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

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

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.


Carlo ha allegato un file: bussola.jpg (65546 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 04/03/2024 alle 13:32


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


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 14:31
Lunedì, 04/03/2024
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.

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 14:39
Lunedì, 04/03/2024
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

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 19:20
Lunedì, 04/03/2024
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.


nightwolf ha allegato un file: pricipale.png (51016 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:03
Lunedì, 04/03/2024
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

  1. Public Class Form1
  2.     Dim bussola As Image = New Bitmap("bussola.png") ' bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
  3.     Dim destinazione As Integer
  4.     Dim avanzamento As Integer
  5.     Dim direzione As Integer
  6.     Dim cX As Integer = bussola.Width \ 2
  7.     Dim cY As Integer = bussola.Height \ 2
  8.     Dim dX As Integer = bussola.Width
  9.     Dim dY As Integer = bussola.Height
  10.     Dim vel As Integer = 2 ' velocità, valori supportati 1, 2, 3, 5, 6, 9, 10 (divisibili per 90)
  11.  
  12.     Private Sub butNord_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butNord.Click
  13.         Label1.Text = "NORD"
  14.     End Sub
  15.  
  16.     Private Sub butEst_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butEst.Click
  17.         Label1.Text = "EST"
  18.     End Sub
  19.  
  20.     Private Sub butSud_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butSud.Click
  21.         Label1.Text = "SUD"
  22.     End Sub
  23.  
  24.     Private Sub butWest_Click(ByVal sender As Object, ByVal e As EventArgs) Handles butWest.Click
  25.         Label1.Text = "WEST"
  26.     End Sub
  27.  
  28.     Private Sub timer1_Tick(sender As Object, e As EventArgs) Handles timer1.Tick
  29.         avanzamento += direzione
  30.         avanzamento = avanzamento Mod 360 ' azzera a 360°
  31.         PictureBox1.Invalidate() ' scatena il paint
  32.         If avanzamento = destinazione Then timer1.Enabled = False
  33.     End Sub
  34.  
  35.     Private Sub Label1_TextChanged(sender As Object, e As EventArgs) Handles Label1.TextChanged
  36.         If Label1.Text = "NORD" Then
  37.             If avanzamento = 0 Then Exit Sub
  38.             destinazione = 0
  39.             ' sceglie la direzione di rotazione
  40.             If avanzamento < 180 Then direzione = -vel Else direzione = vel
  41.             timer1.Enabled = True
  42.         ElseIf Label1.Text = "EST" Then ' o WEST
  43.             If avanzamento = 90 Then Exit Sub
  44.             destinazione = 90
  45.             ' sceglie la direzione di rotazione
  46.             If avanzamento > 90 Then direzione = -vel Else direzione = vel
  47.             timer1.Enabled = True
  48.         ElseIf Label1.Text = "SUD" Then
  49.             If avanzamento = 180 Then Exit Sub
  50.             destinazione = 180
  51.             ' sceglie la direzione di rotazione
  52.             If avanzamento > 180 Then direzione = -vel Else direzione = vel
  53.             timer1.Enabled = True
  54.         ElseIf Label1.Text = "WEST" Then ' o EST
  55.             If avanzamento = 270 Then Exit Sub
  56.             destinazione = 270
  57.             ' normalizza
  58.             If avanzamento = 0 Then avanzamento = 360 ' forza la rotazione antioraria se si è a nord
  59.             ' sceglie la direzione di rotazione
  60.             If avanzamento > 180 Then direzione = -vel Else direzione = vel
  61.             timer1.Enabled = True
  62.         End If
  63.     End Sub
  64.  
  65.     Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
  66.         e.Graphics.TranslateTransform(cX, cY) ' posizione centro
  67.         e.Graphics.RotateTransform(avanzamento) ' rotazione in gradi
  68.         e.Graphics.DrawImage(bussola, -cX, -cY, dX, dY) ' dimensione 100%
  69.     End Sub
  70. End Class


Ultima modifica effettuata da Carlo il 04/03/2024 alle 22:51


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


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 0:45
Martedì, 05/03/2024
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


nightwolf ha allegato un file: nord.png (39876 bytes)
Clicca qui per guardare l'immagine
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