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 - Rotazione linea intorno ad un punto
Forum - C# / VB.NET - Rotazione linea intorno ad un punto

Avatar
Rastyn (Normal User)
Newbie


Messaggi: 5
Iscritto: 24/01/2010

Segnala al moderatore
Postato alle 20:10
Domenica, 24/01/2010

Ho la necessità di creare (uso Visual Basic 2008) una linea che si muove intorno ad un punto (tipo shermo radar per intenderci)e compi una rotazione ogni n secondi.

Ho creato all'interno dell'evento timer la creazione una volta di una linea con "formGraphics.DrawLine(myPen, larghezza, altezza, x, y)" la chiamata successiva la cancello , facendo un clear su tutto lo schermo "formGraphics.Clear(Color.DarkBlue)".
Come effetto grafico va bene, il problema è che insieme alla linea viene cancellato anche tutto il resto sul form. Lo schermo sono costretto a cancellarlo perchè altrimenti sullo stesso visualizzerei tutte le linee create ad istanti differenti.
Come posso inserire un linea, ad esempio come un oggetto, e farla ruotare tenendo fermo un suo estremo, senza la necessità di volta in volta di cancellare lo schermo.
Pensavo a qualcosa di "RotateTransform" ma non ne riesco a venire a capo.

Il mio evento ad ora lo gestisco così:

  
  Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        Dim altezza As Integer
        Dim larghezza As Integer

        altezza = (Me.Height) / 2
        larghezza = (Me.Width) / 2

        Dim x As Integer
        Dim y As Integer
        Dim myPen As New System.Drawing.Pen(System.Drawing.Color.YellowGreen)
        Dim formGraphics As System.Drawing.Graphics
        formGraphics = Me.CreateGraphics()
        myPen.Width = 0.5

        If ctrl = 0 Then
            x = larghezza + altezza * Math.Cos(angolo)
            y = altezza + altezza * Math.Sin(angolo)
            formGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias  'Smoothing della linea
            formGraphics.DrawLine(myPen, larghezza, altezza, x, y)    ' creo linea
            ctrl = 1
        ElseIf ctrl = 1 Then
            formGraphics.Clear(Color.DarkBlue)                        'cancello linea
            angolo = angolo + 0.09
            ctrl = 0
        End If
        myPen.Dispose()
        formGraphics.Dispose()


Grazie

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 20:41
Domenica, 24/01/2010
Invece di cancellare lo schermo potresti prima di tracciare la nuova linea, tracciare la precedente con il colore dello sfondo.


E poi togli tutte le dichiarazioni Dim ... da dentro la sub Timer1_Tick  e anche i .Dispose.
Considerando che il tick presumo sia di un secondo, è avvilente per il programma dover ogni volta inizializzare e distruggere le variabili

Ultima modifica effettuata da Alfonso il 24/01/2010 alle 22:27
PM Quote
Avatar
Rastyn (Normal User)
Newbie


Messaggi: 5
Iscritto: 24/01/2010

Segnala al moderatore
Postato alle 9:25
Lunedì, 25/01/2010

Si ci avevo pensato anche io, ma purtoppo non è corretto, per l'utilizzo che ne devo fare, perchè se la linea si sovrappone con dell'altra grafica quest'ultima rimane "segnata" con una linea di colore delle sfondo.
Quello che mi serve è trattare la linea come un oggetto e fare ruotare sempre la stessa linea cambiandole le coordinate di posizione per un solo estremo (l'altro deve rimanene fisso) oppure "eliminarla fisicamente". Pensavo a qualcosa tipo la classe RotateTransform ma non riesco ad usarla. Qualcuno che l'ha usata sa darmi qualche suggerimento in proposito.

Per i Dim hai perfettamente ragione ma è semplicemente codice di prova per far capire/ e capire io meglio, prima di una stesura più pulita una volta risolto il problema.



PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:56
Lunedì, 25/01/2010
Dovresti usare il metodo RotateTransform richiamandolo dall'oggetto graphics prima di disegnare qualsiasi altra cosa, e passandogli come argomento l'angolo (in gradi e in senso orario).

Ho specificato "metodo" perchè esiste anche una classe RotateTransform, ma fa parte delle animazioni/trasformazioni di WPF e non è compatibile con Graphics.

PM Quote
Avatar
Rastyn (Normal User)
Newbie


Messaggi: 5
Iscritto: 24/01/2010

Segnala al moderatore
Postato alle 19:33
Lunedì, 25/01/2010

Anche con la soluzione di usare il metodo RotateTransform, il problema rimane. Ovvero non è che viene ruotata la stessa linea creata, ma devo impostare un angolo ad una linea che vado poi a creare. Con il risultato di avere tante linee create e non una sola usata come un oggetto che ruota.
In pratica data una linea creata, io vorrei cambiargli il suo angolo di posizione di volta in volta.

Grazie


PM Quote
Avatar
Gianluca87 (Ex-Member)
Expert


Messaggi: 300
Iscritto: 16/11/2008

Segnala al moderatore
Postato alle 15:38
Martedì, 26/01/2010

PM Quote
Avatar
Alfonso (Ex-Member)
Guru


Messaggi: 688
Iscritto: 30/09/2009

Segnala al moderatore
Postato alle 17:22
Martedì, 26/01/2010
Oppure semplicemente:

Nella form1 metti la tua immagine di background
lanci una form2 con transparencykey = colore di background della stessa form2

Disegni le lancette col colore che vuoi e le cancelli con il colore di backgroung

La sovrapponi alla form1

PM Quote
Avatar
Rastyn (Normal User)
Newbie


Messaggi: 5
Iscritto: 24/01/2010

Segnala al moderatore
Postato alle 18:54
Martedì, 26/01/2010


Ottimi entrambi i consigli.
Grazie

PM Quote