Hallo Forum,
ich hab vor kurzer Zeit ein kleines Programm geschrieben, dass Rückgabewerte einer Funktion auf einem Panel darstellt. (=Graph der Funktion ;))
Die Formel kann man zwar nicht direkt im Programm bearbeiten, aber lässt sich relativ bequem im Sourcecode einbauen.
Ganzer Code
Dafür benötigt:
(Projektmappe im Anhang ;))
Interessant ist eigentlich nur:
Hier wird in die Variable values ein Wert eingetragen, der dem Rückgabewert der Funktion entspricht.
Dabei ist jedes Item ein Rückgabewert einer unterschiedlichen Funktion.
Jedes zweite Item wird im Graphen schwarz dargestellt. Da viele Funktionen negative Rückgabewerte liefern, muss man diese nach oben versetzen (v2 + 300). Da man dann die Nulllinie nicht mehr erkennen kann, setzt man eine zweite "Funktion" hinzu (values.Add(300)), die schwarz dargestellt wird, und immer den theoretischen Nullwert besitzt.
Werden die Kurven zu lang, "scrollt" das Programm mit.
Das Programm ist nur zur Veranschaulichung der Graphen gedacht, aber liefert keine genauen Werte
Trotzdem eine nette Spielerei Kann natürlich weit ausgebaut werden
ich hab vor kurzer Zeit ein kleines Programm geschrieben, dass Rückgabewerte einer Funktion auf einem Panel darstellt. (=Graph der Funktion ;))
Die Formel kann man zwar nicht direkt im Programm bearbeiten, aber lässt sich relativ bequem im Sourcecode einbauen.
Dafür benötigt:
- Timer t_timer
- Panel Panel1
(Projektmappe im Anhang ;))
VB.NET-Quellcode
- Public Class Form1
- Private Lists As New List(Of List(Of Point))
- Private last_x As Integer = 0
- Private colors As New List(Of Color)(New Color() {Color.Red, Color.Black, Color.Blue, Color.Black, Color.Orange, Color.Black, Color.Green, Color.Black, Color.Purple, Color.Black, Color.Fuchsia, Color.Black, Color.Olive, Color.Black})
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- bg = New BufferedGraphicsContext().Allocate(Panel1.CreateGraphics, Panel1.ClientRectangle)
- t_timer.Start()
- End Sub
- Private Sub t_timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles t_timer.Tick
- last_x += 1
- 'Werte holen
- Dim values = FetchValues(last_x)
- 'Punkte berechnen
- Dim points = MakePoints(values, last_x)
- 'Punkte in Liste einsortieren
- For index = 0 To points.Count - 1
- 'Falls keine Liste vorhanden eine erstellen
- If Lists.Count = index Then Lists.Add(New List(Of Point))
- 'Punkte einsortieren
- Lists(index).Add(points(index))
- Next
- 'Punkte zeichnen
- DrawPoints()
- End Sub
- Function FetchValues(ByVal x As Integer) As List(Of Integer)
- Dim values As New List(Of Integer)
- 'Werte berechnen
- Dim v0 = 200 * Math.Sin(x / 500)
- Dim v1 = 200 * Math.Sin(x / 100) ^ 1000
- Dim v2 = 200 * Math.Cos(x / 100) ^ Math.Truncate(Math.Abs(v1 / 10)) - v0
- values.Add(v2 + 300)
- values.Add(300)
- values.Add(v0 + v1 + 300)
- values.Add(0)
- Return values
- End Function
- Private corr As Single = 0
- Function MakePoints(ByVal values As List(Of Integer), ByVal x As Integer) As List(Of Point)
- Dim ret As New List(Of Point)
- For Each v In values
- 'x-achse korrigieren
- If x >= Panel1.Width - 25 Then
- bg.Graphics.TranslateTransform(-(1 / Lists.Count), 0)
- bg.Graphics.Clear(Panel1.BackColor)
- corr += (1 / Lists.Count)
- End If
- 'Jeden Wert (y) mit einem x-Wert versehen
- ret.Add(New Point(x, Panel1.Height - v + 25))
- Next
- Return ret
- End Function
- Private bg As BufferedGraphics
- Sub DrawPoints()
- With bg.Graphics
- .FillRectangle(New SolidBrush(Panel1.BackColor), Panel1.ClientRectangle)
- For index = 0 To Lists.Count - 1
- If Lists(index).Count > 1 Then
- .DrawLines(New Pen(New SolidBrush(colors(index))), Lists(index).ToArray)
- End If
- Next
- .DrawLine(Pens.Black, PointToClient(New Point(Cursor.Position.X + corr, 0)), PointToClient(New Point(Cursor.Position.X + corr, Panel1.Height + 1000)))
- If add Then
- grayment += 5
- Else
- grayment -= 5
- End If
- If grayment = 100 Or grayment = 255 Then add = Not add
- .DrawLine(New Pen(Color.FromArgb(grayment, grayment, grayment)), last_x + 1, 0, last_x + 1, Panel1.Height)
- End With
- bg.Render()
- End Sub
- Dim add As Boolean = True
- Dim grayment As Byte = 100
- Private Sub Panel1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Panel1.Click
- t_timer.Enabled = Not t_timer.Enabled
- End Sub
- End Class
Interessant ist eigentlich nur:
VB.NET-Quellcode
- Function FetchValues(ByVal x As Integer) As List(Of Integer)
- Dim values As New List(Of Integer)
- 'Werte berechnen
- Dim v0 = 200 * Math.Sin(x / 500)
- Dim v1 = 200 * Math.Sin(x / 100) ^ 1000
- Dim v2 = 200 * Math.Cos(x / 100) ^ Math.Truncate(Math.Abs(v1 / 10)) - v0
- values.Add(v2 + 300)
- values.Add(300)
- values.Add(v0 + v1 + 300)
- values.Add(0)
- Return values
- End Function
Hier wird in die Variable values ein Wert eingetragen, der dem Rückgabewert der Funktion entspricht.
Dabei ist jedes Item ein Rückgabewert einer unterschiedlichen Funktion.
Jedes zweite Item wird im Graphen schwarz dargestellt. Da viele Funktionen negative Rückgabewerte liefern, muss man diese nach oben versetzen (v2 + 300). Da man dann die Nulllinie nicht mehr erkennen kann, setzt man eine zweite "Funktion" hinzu (values.Add(300)), die schwarz dargestellt wird, und immer den theoretischen Nullwert besitzt.
Werden die Kurven zu lang, "scrollt" das Programm mit.
Das Programm ist nur zur Veranschaulichung der Graphen gedacht, aber liefert keine genauen Werte
Trotzdem eine nette Spielerei Kann natürlich weit ausgebaut werden