Koordinatensystem automatisch verschieben


TobsDi

Grünschnabel
Hallo! Schon wieder ich ;)
Naja, jetzt hab ich wieder ein Problem...
Ich hab eine Picturebox, in welche ich ein Koordinatensystem gezeichnet hab.
Dieses wird nun mit der Zeit mit einem Graphen gefüllt.
So ungefähr wie im Windows-Taskmanager, bloß von links.
Wenn nun also der Graph eine Position x erreicht hat, welche kurz vor dem rechten Rand liegt, dann soll sich der komplette Inhalt der Picturebox nach links verschieben, und zwar genau in derselben Geschwindigkeit, wie neue Werte zum Graphen hinzukommen. Also kontinuierlich, meinetwegen 5 Pixel pro Sekunde.
Könnte mir da jemand weiterhelfen?
Die Aktualisierung des Graphen hab ich mit nem Timer übernommen, und das Zeichnen des Graphen mit Hilfe der Ergebnisse des letzten Threads:
Code:
Private Sub Timer2_Draw_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2_Draw.Tick
        idx3 += 1
        Dim Rec As Rectangle = PictureBox2_Draw.ClientRectangle
        'y-Position der akt. Temperatur:
        Dim y As Integer = CInt(Rec.Height - Temp - 20)       '- 2 * (Rec.Height / 11)
        Using G As Graphics = Graphics.FromImage(Bmp)
            'Akt. Temperatur
            Using Sb As SolidBrush = New SolidBrush(Color.IndianRed)
                G.FillRectangle(Sb, New Rectangle(20 + idx3, y, 2, 2))
            End Using
            Dim Stift As New Pen(Color.Black)
            Stift.Width = 2
            Stift.EndCap = Drawing2D.LineCap.ArrowAnchor
            'Koordinatensystem
            'Achsen
            G.DrawLine(Stift, 20, Rec.Height - 20, 20, 20)
            G.DrawLine(Stift, 20, Rec.Height - 20, Rec.Width - 20, Rec.Height - 20)
            'Zahlenunterteilung
            Dim Breite As Single = 50.0
            Dim Hoehe As Single = 50.0
            For x1 As Single = 20 + Breite To Rec.Width - 20 Step Breite
                G.DrawLine(Pens.Black, x1, Rec.Height - 18, x1, 20)
                G.DrawString(CStr(x1 - 20), New Font("Arial", 6.5), Brushes.Black, _
                            x1 - 10, Rec.Height - 15)
            Next
            For x2 As Single = Rec.Height - 20 - Hoehe To 20 Step -Hoehe
                G.DrawLine(Pens.Black, 18, x2, Rec.Width - 20, x2)
                G.DrawString(CStr(Rec.Height - x2 - 20), New Font("Arial", 6.5), Brushes.Black, _
                            0, x2 - 8)
            Next
            'Hintergrund-Temp-Info
            'G.DrawString(CStr(Math.Round(Temp, 2)) & "°C", New Font("Segoe UI", 50), _
            '            Brushes.BlueViolet, Rec.Width / 2, Rec.Height / 2)
            G.Flush()
        End Using
        PictureBox2_Draw.Invalidate()
    End Sub

Vielen Dank im Voraus!
 

Spyke

Premium-User
Was genau passt nicht?
Vielleicht hast du auch nen Screens wies falsch und richtig ausschauen soll.

Und bearbeite mal dein Post ich glaube es gibt nen Code Tag für VB damit der Quelltext farbig hervorgehoben wird.
Bei größerem Quelltext ohne Syntaxhighlight tu ich mich immer schwer den zu lesen ;)
 

TobsDi

Grünschnabel
Und bearbeite mal dein Post ich glaube es gibt nen Code Tag für VB damit der Quelltext farbig hervorgehoben wird.
Echt? hab ich ned gefunden - wo gibts die Option?

Also mit dem Graph an sich passt alles, wie du auf dem SS siehst, wird er angezeigt.
Nur, er verschwindet nach ner Zeit im rechten Bildrand.
Was ich will, ist, dass sich das komplette Koordinatensystem nach links verschiebt (so dass z.B. die y-Achse verschwindet, usw).
Der schon gezeichnete Abschnitt des Graphs soll mit dem Koordinatensystem nach links aus dem Bild wandern; der rechte, neu gezeichnete Teil des Graphs aber soll von dem Zeitpunkt an, wo er die mit X gekennzeichnete Stelle erreicht, auch dort bleiben.

So dass eben scheinbar das Koordinatensystem unter dem Graph weggezogen wird.
 

Anhänge

  • Screenshot001.jpg
    Screenshot001.jpg
    35,2 KB · Aufrufe: 35

Spyke

Premium-User
Echt? hab ich ned gefunden - wo gibts die Option?
Das ist irgend nen BBCode Tag, frag mich nicht welcher, da ich in C# Prog. nehm ich immer den PHP Tag in der Iconleiste damit ist es auch lesbar :D glaube aber nicht das das bei VB auch mit dem geht ;)

Ich hab mich mal bissel versucht durch den Code zu kämpfen.
Du scheint eine Variable Step zu haben die für die Horizontale und Vertikale Darstellung des Netzes veranwortlich zu sein scheint.
Das scheint mir so nicht richtig, das würde ich trennen sprich ein StepH und ein StepV oder so :rolleyes:
Problem besteht nämlich das sich deine Vertikale Darstellung auch ändern würde wenn die Linie nur über den Horizontalenbereich hinaus geht.

Nun zum zeichnen.
Du hast ja immer einen festen Bereich in dem du zeichnen willst, also durchlaufe deine for Schleifen auch in diesem festen Bereich:
Code:
For x1 As Single = rec.X To rec.Right Step Breite
die Position für die Darstellung der Linie und des Textes würde ich in der Schleife ermitteln.
Ungefähr so:
Code:
xPosion=Int(x1/stepH)
G.DrawLine(Pens.Black, xPosion, Rec.Height - 18, xPosion, 20)
G.DrawString(CStr(xPosion - 20), New Font("Arial", 6.5), Brushes.Black, _
      xPosion - 10, Rec.Height - 15)

Und schau dir mal die DrawString Methode genauer an, dort kannst du auch ein Rectangle über geben in welchem bereich der String gezeichnet werden darf und dazu noch StringAlignment zur Ausrichtung des Textes, vielleicht ist das besser als dieses Subtrahieren.

Hoffe konnte helfen.
Und Fehler sind nicht ausgeschlossen, alles entstand im Kopf und mein VB ist auch schon ne Weile her ;)
 

TobsDi

Grünschnabel
Vielen Dank, so t es einigermaßen! :)
Das "Step" is übrigens keine Variable, sondern das gibt an, dass bei jedem Durchlauf der For-Schleife zu der Zählvariablen nicht einfach "1", sondern das was dahinter steht, hinzugefügt wird. In dem Fall also "-Hoehe" oder "Breite".
Sehr schön ;-) --> Facharbeit kann kommen ^^
mfg Tobi

Edit: Keine "MankindException" ^^
 
Zuletzt bearbeitet:

Neue Beiträge

Forum-Statistiken

Themen
272.360
Beiträge
1.558.632
Mitglieder
187.834
Neuestes Mitglied
jordanx0206