Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
buon giorno a tutti, sto continuando il mio progetto riguardante uno stereo interattivo, dopo aver completato la parte audio, stazione radio e musica, adesso mi è venuto il pallino di avere una bussola in macchina, vedendola nella macchina di mia moglie, ho detto perchè non averla anchio.
tramite arduino e un gps posso inviare al mio progetto la direzione, (nord, sud, est, west), adesso, il problema sta nel disegnare la bussola e cioè nel far girare la bussola di un gradoalla volta in base alla direzione presente nella label. mi spiego meglio,
se nella label1 c'è scritto "nord" la bussola devo girare dal punto dove si trova fino ad arrivare al grado "0" o "360", cosi x il resto delle coordinate, ho visto alcuni esempi, ma fanno girare l immagine con un timer all' infinito. come posso fare? credo che bisogna avere un timer sempre attivo, perchè ogni qualvolta che la label cambia text questo devo far ruotare l immagine, ma di più non so.
grazie mille
questo è l immagine che intendo usare
puoi sfruttare tutta la GDI in seguito direttamente nel void Draw.
La differenza e che non hai bisogno di nessun timer, e tutto già pre-impostato,
ed hai la possibilità di avere un zoom o una telecamera 2d.
Per il timer sei a posto, Thejuster è stato chiaro.
Ti propongo un codice che al variare del contenuto in gradi di una label ruota l'immagine di conseguenza:
1) ho inserito una scrollbar che simula la variazione del valore in gradi nella label (entrambi creati in runtime).
2) ho ridimensionato l'immagine e ritagliata circolare in modo che possa essere sovrapposta a qualsiasi altro disegno (allegata).
3) codice in C#
Codice sorgente - presumibilmente C#
usingSystem;
usingSystem.Drawing;
usingSystem.Drawing.Drawing2D;
usingSystem.Windows.Forms;
namespace Ruota_Immagine
{
publicpartialclass Form1 : Form
{
Image bussola =new Bitmap("bussola.png");// bmp in ram dal file originale, deve esistere nella cartella dell'eseguibile
Label lb =new Label();// label con il valore di rotazione
HScrollBar hsb =new HScrollBar();// simulazione dato di rotazione
public Form1()
{
InitializeComponent();
this.BackgroundImageLayout= ImageLayout.Zoom;// adatta l'immagine al ridimensionamento
this.DoubleBuffered= true;// elimina sfarfallio
hsb.Left= lb.Width;// posizione della scrollbar
hsb.Width=this.ClientSize.Width- lb.Width;// larghezza della scrollbar
hsb.Maximum=370;// valore massimo scrollbar
this.Controls.Add(lb);// label nel form
this.Controls.Add(hsb);// scrollbar nel form
lb.TextChanged+= Lb_TextChanged;// evento cambio testo nella label
hsb.Scroll+= Hsb_Scroll;// evento cambiovalore nella scrollbar
lb.Text="000";
Lb_TextChanged(lb, new EventArgs());// primo disegno
la mia richiesta è che se il testo nella label1 è "NORD", la bussola devrebbe indicare in nord, cosi come se il testo della label1 è sud la bussola dovrebbe indicare il sud, ma non semplicemente cambiando imagine, perchè fin li, riesco anchio, ma vedendola muovere o solamente verso destra, o solamente verso sinistra, di grado in grado, come una bussola vera.
Mi sembra che oggi ti vada bene, Thejuster ti ha regalato la bussola con l'ago.
Io ti regalo la bussola con il quadrante che ruota (allegato progetto).
L'esempio che ti avevo postato andava integrato con la richiesta nord, est, sud, west
Codice sorgente - presumibilmente C#
usingSystem;
usingSystem.Drawing;
usingSystem.Drawing.Drawing2D;
usingSystem.Windows.Forms;
namespace Ruota_Immagine
{
publicpartialclass Form1 : Form
{
Image bussola =new Bitmap("bussola.png");// bmp in ram dal file originale, deve esistere nella cartelle dell'eseguibile
int destinazione;
int avanzamento;
int direzione;
public Form1()
{
InitializeComponent();
this.BackgroundImageLayout= ImageLayout.Zoom;// adatta l'immagine al ridimensionamento
this.DoubleBuffered= true;// elimina sfarfallio
Lb_TextChanged(lb, new EventArgs());// primo disegno
}
privatevoid Lb_TextChanged(object sender, EventArgs e)// al cambio del valore
{
int valoreGradi = Convert.ToUInt16(lb.Text);// valore in gradi
Image rot0 =(Image)bussola.Clone();// partenza sempre dall'originale a zero gradi
Graphics g = Graphics.FromImage(rot0);// layer grafico di lavoro
// centro immagine
int centerX = rot0.Width/2;
int centerY = rot0.Height/2;
// Crea una matrice di trasformazione per ruotare l'immagine
e premendo il pulsante start, tutto funzionava, era solo da capire come far girare la bussola se si indicava nord, sud, est o west.
ho provato a convertire il codice in vb.net ma mi dava errore in g.DrawImage(image, -rx / 2, -ry / 2, rx, ry), e non capivo dove era lo sbaglio, stavo cercando in rete, prima di leggere i vostri esempi.
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 AsInteger= rot0.Width\ 2
Dim centerY AsInteger= rot0.Height\2
' Crea una matrice di trasformazione per ruotare l'immagine
Dim matrix AsNew 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
EndSub
PrivateSub timer1_Tick(ByVal sender AsObject, ByVal e As EventArgs)Handles timer1.Tick
avanzamento += direzione
avanzamento = avanzamento Mod360' azzera a 360°
rotate(avanzamento)
lb1.Text= avanzamento.ToString("000°")
Dim west AsInteger=(avanzamento + 180)Mod360' azzera a 360°
lb2.Text= west.ToString("000°")
If avanzamento = destinazione Then
timer1.Enabled=False
EndIf
EndSub
PrivateSub butNord_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butNord.Click
' esce se già in posizione
If avanzamento = 0 ThenExitSub
destinazione =0
' sceglie la direzione di rotazione
If avanzamento < 180 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
EndSub
PrivateSub butEst_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butEst.Click
' esce se già in posizione
If avanzamento = 90 ThenExitSub
destinazione =90
' sceglie la direzione di rotazione
If avanzamento > 90 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
EndSub
PrivateSub butSud_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butSud.Click
' esce se già in posizione
If avanzamento = 180 ThenExitSub
destinazione =180
' sceglie la direzione di rotazione
If avanzamento > 180 Then direzione =-2 Else direzione = 2
timer1.Enabled=True
EndSub
PrivateSub butWest_Click(ByVal sender AsObject, ByVal e As EventArgs)Handles butWest.Click
' esce se già in posizione
If avanzamento = 270 ThenExitSub
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
EndSub
EndClass
Come prima, questa è la partenza.
Se ti piace programmare non ti accontentare di copiare codice, approfitta di chi ti può spiegare passo passo i perché
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.