Oppure

Loading
03/03 23:17
Carlo
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.
 dim lettera as integer = serialport1.read
if lettera ="N" then
label1.text="NORD"
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
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


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.


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:

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