Oppure

Loading
02/03 14:19
nightwolf
Grazie mille, non so, ma mi viene più semplice capire vb.net.
Infatti vorrei chiederti tantissime cose su quello che hai scritto. Lo faro in questi giorni. Cosi potrai spiegarmi il perché di certe cose anziché altre.
aaa
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.
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.
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?

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.
 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?



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.


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