Help with Math Plot, Graph, Curve
-
28 Temmuz 2010 Çarşamba 14:36
I would like to make a graph drawer but I have no idea where to start from, so if anyone could recommend a method or seen a tutorial or found a project, I would really like to see. I would prefere to be in vb language.
Thanks
Tüm Yanıtlar
-
03 Ağustos 2010 Salı 06:41Moderatör
Hello Dim131,
Thanks for your post.
Sorry for the dalay. Check the following examples which about how to create chart or graph in VB.NET. Hope them helpful.
http://www.linglom.com/2010/05/11/creating-graph-with-vb-net-part-1-basic-chart/
(Creating Graph with VB.NET)
http://msdn.microsoft.com/en-us/beginner/bb308769.aspx
(Generate Charts and Graphs Using Visual Studio Express)If you have any problems, please feel free to follow up.
Best regards,
Liliane
Please mark the replies as answers if they help and unmark them if they provide no help.
Welcome to the All-In-One Code Framework! If you have any feedback, please tell us. Thanks -
03 Eylül 2010 Cuma 18:51Thanks for your help, but what I was looking for wasn't exactly that. I am looking for how I can enter a mathematical expression (with an x value) and the programme can plot it in the cartesian coordinates system
thanks,
Dimitris -
05 Mart 2011 Cumartesi 00:53I am sorry if this does not belong here I dont usally write just read. Dim131 I am having the same issues i am also very determined to find out how to plot points and I hope lines from my app that calculates slope intercept. If you do find a solution or have already please help me I will return the favor.
-
26 Aralık 2011 Pazartesi 12:34
One way I have over come this problem is by working out all the possible "y" values if the graph comes in the form of "y=mx+c" at small intervals of of "x." This "small" interval of x will depend on your screen resolution and how accurate you the the graph to be. After this create an array of x values and y values. The y values will be generated by solving the equation of "y=mx+c." After this have a loop to "plot" the graph for you for each point within certain limit. This limit will depend on yours or the user's screen resolution.
Please feel free to email me at: argha_sarkar1994@yahoo.co.in or you can visit my youtube channel on lionking422 or my website at: sagga.co.uk.
-
26 Aralık 2011 Pazartesi 13:43
Hi,
Tell us if this code and explanation helps you.
When the program starts, it draws grid lines for the graph. When the user clicks the Graph button, the program checks the m_GraphThread object to see if the graphing thread is running. If m_GraphThread is Nothing, then the program creates the new thread, making its startup routine the DrawGraph subroutine. It sets the thread's priority to BelowNormal so it won't preempt the main program and starts the thread.
If the m_GraphThread object is not Nothing, then the program stops the thread.
Private m_GraphThread As Thread ' Start drawing the graph. Private Sub btnGraph_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnGraph.Click If m_GraphThread Is Nothing Then ' The thread isn't running. Start it. AddStatus("Starting thread") m_GraphThread = New Thread(AddressOf DrawGraph) m_GraphThread.Priority = ThreadPriority.BelowNormal m_GraphThread.IsBackground = True m_GraphThread.Start() AddStatus("Thread started") btnGraph.Text = "Stop" Else ' The thread is running. Stop it. AddStatus("Stopping thread") m_GraphThread.Abort() ' m_GraphThread.Join() m_GraphThread = Nothing AddStatus("Thread stopped") btnGraph.Text = "Start" End If End Sub
When the new thread starts, it runs subroutine DrawGraph. This routine repeatedly calls subroutine NewValue to generate a value and PlotValue to plot the value. When the user clicks the Start button, the program aborts the thread and the thread's DrawGraph code catches an exception.
' Draw a graph until stopped. Private Sub DrawGraph() Try ' Generate pseudo-random values. Dim y As Integer = m_Y Do ' Generate the next value. NewValue() ' Plot the new value. PlotValue(y, m_Y) y = m_Y Loop Catch ex As Exception AddStatus("[Thread] " & ex.Message) End Try End Sub
Subroutine NewValue generates a random new value in a straightforward manner.
' Generate the next value. Private Sub NewValue() ' Delay a bit before calculating the value. Dim stop_time As Date = Now.AddMilliseconds(20) Do While Now < stop_time Loop ' Calculate the next value. Static rnd As New Random m_Y += rnd.Next(-4, 5) If m_Y < 0 Then m_Y = 0 If m_Y >= picGraph.ClientSize.Height - 1 Then m_Y = _ picGraph.ClientSize.Height - 1 End Sub `This is where you can write equation and mathematical stuffs to calculate values
Subroutine PlotValue is a bit odd. It cannot directly access the program's main form because controls (including the form) can only be modified by the thread that created them. PlotValue starts by checking the InvokeRequired property. If InvokeRequired is True, then the code is running on the thread so it must invoke the main UI thread. In that case, the code makes an array of parameters to pass to the main UI thread and invokes the main thread's PlotValue method.
At this point, the main UI thread executes PlotValue. This time InvokeRequired returns False because we're running on the main UI thread. The program uses the Graphics object's DrawImage method to move the existing graph one pixel to the left and then draws the new value.
' Plot a new value. Private Delegate Sub PlotValueDelegate(ByVal old_y As _ Integer, ByVal new_y As Integer) Private Sub PlotValue(ByVal old_y As Integer, ByVal new_y _ As Integer) ' See if we're on the worker thread and thus ' need to invoke the main UI thread. If Me.InvokeRequired Then ' Make arguments for the delegate. Dim args As Object() = {old_y, new_y} ' Make the delegate. Dim plot_value_delegate As PlotValueDelegate plot_value_delegate = AddressOf PlotValue ' Invoke the delegate on the main UI thread. Me.Invoke(plot_value_delegate, args) ' We're done. Exit Sub End If ' Make the Bitmap and Graphics objects. Dim wid As Integer = picGraph.ClientSize.Width Dim hgt As Integer = picGraph.ClientSize.Height Dim bm As New Bitmap(wid, hgt) Dim gr As Graphics = Graphics.FromImage(bm) ' Move the old data one pixel to the left. gr.DrawImage(picGraph.Image, -1, 0) ' Erase the right edge and draw guide lines. gr.DrawLine(Pens.Blue, wid - 1, 0, wid - 1, hgt - 1) For i As Integer = m_Ymid To picGraph.ClientSize.Height _ Step GRID_STEP gr.DrawLine(Pens.LightBlue, wid - 2, i, wid - 1, i) Next i For i As Integer = m_Ymid To 0 Step -GRID_STEP gr.DrawLine(Pens.LightBlue, wid - 2, i, wid - 1, i) Next i ' Plot a new pixel. gr.DrawLine(Pens.White, wid - 2, old_y, wid - 1, new_y) ' Display the result. picGraph.Image = bm picGraph.Refresh() gr.Dispose() End Sub
This program's AddStatus subroutine adds a status message to the txtStatus TextBox. Because the TextBox was created by the main UI thread, the program must check InvokeRequired as before.' Add a status string to txtStatus. Private Delegate Sub AddStatusDelegate(ByVal txt As String) Private Sub AddStatus(ByVal txt As String) ' See if we're on the worker thread and thus ' need to invoke the main UI thread. If Me.InvokeRequired Then ' Make arguments for the delegate. Dim args As Object() = {txt} ' Make the delegate. Dim add_status_delegate As AddStatusDelegate add_status_delegate = AddressOf AddStatus ' Invoke the delegate on the main UI thread. Me.Invoke(add_status_delegate, args) ' We're done. Exit Sub End If txtStatus.Text &= vbCrLf & txt txtStatus.Select(txtStatus.Text.Length, 0) txtStatus.ScrollToCaret() End Sub
Notes: This example uses a Timer to update a label holding the current time. Because the graphing is performed on a separate thread, the Timer continues to operate while graphing is occurring. This example is a bit tedious to understand but here is it... Try this and you will succeed...!!
ThanksRehan Bharucha - The Tech Robot
MCTS, MCITP, MCPD, MCT
- Düzenleyen REHAN BHARUCHA 26 Aralık 2011 Pazartesi 13:44
- Yanıt Olarak Öneren REHAN BHARUCHA 26 Aralık 2011 Pazartesi 13:44
- Yanıt Önerisini Geri Alan REHAN BHARUCHA 28 Aralık 2011 Çarşamba 15:44
-
28 Aralık 2011 Çarşamba 15:43
Hi,
Tell us if this code and explanation helps you.
When the program starts, it draws grid lines for the graph. When the user clicks the Graph button, the program checks the m_GraphThread object to see if the graphing thread is running. If m_GraphThread is Nothing, then the program creates the new thread, making its startup routine the DrawGraph subroutine. It sets the thread's priority to BelowNormal so it won't preempt the main program and starts the thread.
If the m_GraphThread object is not Nothing, then the program stops the thread.
Private m_GraphThread As Thread ' Start drawing the graph. Private Sub btnGraph_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnGraph.Click If m_GraphThread Is Nothing Then ' The thread isn't running. Start it. AddStatus("Starting thread") m_GraphThread = New Thread(AddressOf DrawGraph) m_GraphThread.Priority = ThreadPriority.BelowNormal m_GraphThread.IsBackground = True m_GraphThread.Start() AddStatus("Thread started") btnGraph.Text = "Stop" Else ' The thread is running. Stop it. AddStatus("Stopping thread") m_GraphThread.Abort() ' m_GraphThread.Join() m_GraphThread = Nothing AddStatus("Thread stopped") btnGraph.Text = "Start" End If End Sub
When the new thread starts, it runs subroutine DrawGraph. This routine repeatedly calls subroutine NewValue to generate a value and PlotValue to plot the value. When the user clicks the Start button, the program aborts the thread and the thread's DrawGraph code catches an exception.
' Draw a graph until stopped. Private Sub DrawGraph() Try ' Generate pseudo-random values. Dim y As Integer = m_Y Do ' Generate the next value. NewValue() ' Plot the new value. PlotValue(y, m_Y) y = m_Y Loop Catch ex As Exception AddStatus("[Thread] " & ex.Message) End Try End Sub
Subroutine NewValue generates a random new value in a straightforward manner.
' Generate the next value. Private Sub NewValue() ' Delay a bit before calculating the value. Dim stop_time As Date = Now.AddMilliseconds(20) Do While Now < stop_time Loop ' Calculate the next value. Static rnd As New Random m_Y += rnd.Next(-4, 5) If m_Y < 0 Then m_Y = 0 If m_Y >= picGraph.ClientSize.Height - 1 Then m_Y = _ picGraph.ClientSize.Height - 1 End Sub `This is where you can write equation and mathematical stuffs to calculate values
Subroutine PlotValue is a bit odd. It cannot directly access the program's main form because controls (including the form) can only be modified by the thread that created them. PlotValue starts by checking the InvokeRequired property. If InvokeRequired is True, then the code is running on the thread so it must invoke the main UI thread. In that case, the code makes an array of parameters to pass to the main UI thread and invokes the main thread's PlotValue method.
At this point, the main UI thread executes PlotValue. This time InvokeRequired returns False because we're running on the main UI thread. The program uses the Graphics object's DrawImage method to move the existing graph one pixel to the left and then draws the new value.
' Plot a new value. Private Delegate Sub PlotValueDelegate(ByVal old_y As _ Integer, ByVal new_y As Integer) Private Sub PlotValue(ByVal old_y As Integer, ByVal new_y _ As Integer) ' See if we're on the worker thread and thus ' need to invoke the main UI thread. If Me.InvokeRequired Then ' Make arguments for the delegate. Dim args As Object() = {old_y, new_y} ' Make the delegate. Dim plot_value_delegate As PlotValueDelegate plot_value_delegate = AddressOf PlotValue ' Invoke the delegate on the main UI thread. Me.Invoke(plot_value_delegate, args) ' We're done. Exit Sub End If ' Make the Bitmap and Graphics objects. Dim wid As Integer = picGraph.ClientSize.Width Dim hgt As Integer = picGraph.ClientSize.Height Dim bm As New Bitmap(wid, hgt) Dim gr As Graphics = Graphics.FromImage(bm) ' Move the old data one pixel to the left. gr.DrawImage(picGraph.Image, -1, 0) ' Erase the right edge and draw guide lines. gr.DrawLine(Pens.Blue, wid - 1, 0, wid - 1, hgt - 1) For i As Integer = m_Ymid To picGraph.ClientSize.Height _ Step GRID_STEP gr.DrawLine(Pens.LightBlue, wid - 2, i, wid - 1, i) Next i For i As Integer = m_Ymid To 0 Step -GRID_STEP gr.DrawLine(Pens.LightBlue, wid - 2, i, wid - 1, i) Next i ' Plot a new pixel. gr.DrawLine(Pens.White, wid - 2, old_y, wid - 1, new_y) ' Display the result. picGraph.Image = bm picGraph.Refresh() gr.Dispose() End Sub
This program's AddStatus subroutine adds a status message to the txtStatus TextBox. Because the TextBox was created by the main UI thread, the program must check InvokeRequired as before.' Add a status string to txtStatus. Private Delegate Sub AddStatusDelegate(ByVal txt As String) Private Sub AddStatus(ByVal txt As String) ' See if we're on the worker thread and thus ' need to invoke the main UI thread. If Me.InvokeRequired Then ' Make arguments for the delegate. Dim args As Object() = {txt} ' Make the delegate. Dim add_status_delegate As AddStatusDelegate add_status_delegate = AddressOf AddStatus ' Invoke the delegate on the main UI thread. Me.Invoke(add_status_delegate, args) ' We're done. Exit Sub End If txtStatus.Text &= vbCrLf & txt txtStatus.Select(txtStatus.Text.Length, 0) txtStatus.ScrollToCaret() End Sub
Notes: This example uses a Timer to update a label holding the current time. Because the graphing is performed on a separate thread, the Timer continues to operate while graphing is occurring. This example is a bit tedious to understand but here is it... Try this and you will succeed...!!
ThanksRehan Bharucha - The Tech Robot
MCTS, MCITP, MCPD, MCT
Hi Sir,There was a slight mistake in the above code.
First thing, assign a white background picture to the picturebox picgraph
Set the gridstep variable to the desired gap in between the grid lines horrizontal here i have chosen 3
Take up a windows application and copy paste the code with controls button named as btnGraph textbox as txtStatus and picturebox as picGraph, set the form background color as white, picturebox default image to white and run the application after pasting this code entirely without changing the name of the form.
Imports System.Threading Public Class Form1 Private m_GraphThread As Thread Private m_Y As Integer Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load End Sub ' Start drawing the graph. Private Sub btnGraph_Click(sender As System.Object, e As System.EventArgs) Handles btnGraph.Click If m_GraphThread Is Nothing Then ' The thread isn't running. Start it. AddStatus("Starting thread") m_GraphThread = New Thread(AddressOf DrawGraph) m_GraphThread.Priority = ThreadPriority.BelowNormal m_GraphThread.IsBackground = True m_GraphThread.Start() AddStatus("Thread started") btnGraph.Text = "Stop" Else ' The thread is running. Stop it. AddStatus("Stopping thread") m_GraphThread.Abort() ' m_GraphThread.Join() m_GraphThread = Nothing AddStatus("Thread stopped") btnGraph.Text = "Start" End If End Sub ' Draw a graph until stopped. Private Sub DrawGraph() Try ' Generate pseudo-random values. Dim y As Integer = m_Y Do ' Generate the next value. NewValue() ' Plot the new value. PlotValue(y, m_Y) y = m_Y Loop Catch ex As Exception AddStatus("[Thread] " & ex.Message) End Try End Sub ' Generate the next value. Private Sub NewValue() ' Delay a bit before calculating the value. Dim stop_time As Date = Now.AddMilliseconds(20) Do While Now < stop_time Loop ' Calculate the next value. Static rnd As New Random m_Y = rnd.Next(10, 100) If m_Y < 0 Then m_Y = 0 If m_Y >= picGraph.ClientSize.Height - 1 Then m_Y = _ picGraph.ClientSize.Height - 1 End Sub Private Delegate Sub PlotValueDelegate(ByVal old_y As Integer, ByVal new_y As Integer) Private Sub PlotValue(ByVal old_y As Integer, ByVal new_y As Integer) ' See if we're on the worker thread and thus ' need to invoke the main UI thread. If Me.InvokeRequired Then ' Make arguments for the delegate. Dim args As Object() = {old_y, new_y} ' Make the delegate. Dim plot_value_delegate As PlotValueDelegate plot_value_delegate = AddressOf PlotValue ' Invoke the delegate on the main UI thread. Me.Invoke(plot_value_delegate, args) ' We're done. Exit Sub End If ' Make the Bitmap and Graphics objects. Dim wid As Integer = picGraph.ClientSize.Width Dim hgt As Integer = picGraph.ClientSize.Height Dim bm As New Bitmap(wid, hgt) Dim gr As Graphics = Graphics.FromImage(bm) Dim m_Ymid As Integer Dim GRID_STEP As Integer = 10 'Top left corner is considered as 0
' Move the old data one pixel to the left. gr.DrawImage(picGraph.Image, -1, 0) ' Erase the right edge and draw guide lines. gr.DrawLine(Pens.Blue, wid - 1, 0, wid - 1, hgt - 1) For i As Integer = m_Ymid To picGraph.ClientSize.Height Step GRID_STEP gr.DrawLine(Pens.LightBlue, wid - 2, i, wid - 1, i) Next i For i As Integer = m_Ymid To 0 Step -GRID_STEP gr.DrawLine(Pens.LightBlue, wid - 2, i, wid - 1, i) Next i ' Plot a new pixel. gr.DrawLine(Pens.White, wid - 2, old_y, wid - 1, new_y) ' Display the result. picGraph.Image = bm picGraph.Refresh() gr.Dispose() End Sub ' Add a status string to txtStatus. Private Delegate Sub AddStatusDelegate(ByVal txt As String) Private Sub AddStatus(ByVal txt As String) ' See if we're on the worker thread and thus ' need to invoke the main UI thread. If Me.InvokeRequired Then ' Make arguments for the delegate. Dim args As Object() = {txt} ' Make the delegate. Dim add_status_delegate As AddStatusDelegate add_status_delegate = AddressOf AddStatus ' Invoke the delegate on the main UI thread. Me.Invoke(add_status_delegate, args) ' We're done. Exit Sub End If txtStatus.Text &= vbCrLf & txt txtStatus.Select(txtStatus.Text.Length, 0) txtStatus.ScrollToCaret() End Sub End Class
This application when run produces the result by automated plotting of graph based on random values in the function NewValue where you can also put equation to calculate value for your Y axis (Your logic comes in this function).The below image is when the application is run, the graph comes plotting from right side of screen scrolling towards the left of the screen, just like a eco cardiogram of a heart patient based on random values.
This is it!
I hope this might have solved a bit of your concern. Dont forget to upvote it and mark as answer if it helps you even a bit..
ThanksRehan Bharucha - The Tech Robot
MCTS, MCITP, MCPD, MCT
- Düzenleyen REHAN BHARUCHA 28 Aralık 2011 Çarşamba 15:44
- Yanıt Olarak Öneren REHAN BHARUCHA 28 Aralık 2011 Çarşamba 15:44
- Düzenleyen REHAN BHARUCHA 29 Aralık 2011 Perşembe 15:55