C#動(dòng)態(tài)繪制多條曲線(xiàn)的方法
本文實(shí)例為大家分享了C#動(dòng)態(tài)繪制多條曲線(xiàn)的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)時(shí)繪制多條曲線(xiàn),縱軸為數(shù)值,橫軸為時(shí)間,精確到毫秒
實(shí)現(xiàn)效果如下:
代碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace chartTest { ? ? public partial class Form1 : Form ? ? { ? ? ? ? private int maxSize=20; ? ? //圖表顯示的數(shù)據(jù)最大數(shù)量 ? ? ? ? private Queue<string> getX = new Queue<string>(); ? //存儲(chǔ)x坐標(biāo) ? ? ? ? private Queue<Int32> getY = new Queue<int>(); ? //存儲(chǔ)y坐標(biāo) ? ? ? ? System.Timers.Timer timer1 = new System.Timers.Timer(); ? ? ? ? public Form1() ? ? ? ? { ? ? ? ? ? ? InitializeComponent(); ? ? ? ? } ? ? ? ? //獲取時(shí)間軸橫坐標(biāo) ? ? ? ? private string ?setX()? ? ? ? ? { ? ? ? ? ? ? string time = DateTime.Now.ToString("mm:ss.fff"); ? ? ? ? ? ? /* if (getX.Count > 15) ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getX.Dequeue(); ? ? ? ? ? ? ?} ? ? ? ? ? ? ?else? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getX.Enqueue(time); ? ? ? ? ? ? ?}*/ ? ? ? ? ? ? return time; ? ? ? ? } ? ? ? ? //獲取值 縱坐標(biāo) ? ? ? ? private int ?setY1()? ? ? ? ? { ? ? ? ? ? ? int y = new Random().Next(-100, 0); ? ? ? ? ? ? /* if (getY.Count > 15) ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Dequeue(); ? ? ? ? ? ? ?} ? ? ? ? ? ? ?else? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Enqueue(y); ? ? ? ? ? ? ?}*/ ? ? ? ? ? ? return y; ? ? ? ? } ? ? ? ? private int setY2() ? ? ? ? { ? ? ? ? ? ? int y = new Random().Next(-200, 100); ? ? ? ? ? ? /* if (getY.Count > 15) ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Dequeue(); ? ? ? ? ? ? ?} ? ? ? ? ? ? ?else? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Enqueue(y); ? ? ? ? ? ? ?}*/ ? ? ? ? ? ? return y; ? ? ? ? } ? ? ? ? private int setY3() ? ? ? ? { ? ? ? ? ? ? int y = new Random().Next(100, 300); ? ? ? ? ? ? /* if (getY.Count > 15) ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Dequeue(); ? ? ? ? ? ? ?} ? ? ? ? ? ? ?else? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Enqueue(y); ? ? ? ? ? ? ?}*/ ? ? ? ? ? ? return y; ? ? ? ? } ? ? ? ? private double setY4() ? ? ? ? { ? ? ? ? ? ? double y0 = new Random().Next(100, 300); ? ? ? ? ? ? double y = y0 * 0.1; ? ? ? ? ? ? /* if (getY.Count > 15) ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Dequeue(); ? ? ? ? ? ? ?} ? ? ? ? ? ? ?else? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?getY.Enqueue(y); ? ? ? ? ? ? ?}*/ ? ? ? ? ? ? return y; ? ? ? ? } ? ? ? ? //將坐標(biāo)點(diǎn)添加進(jìn)系列進(jìn)行繪圖 ? ? ? ? private void paint()? ? ? ? ? { ? ? ? ? ? ? try ? ? ? ? ? ? { ? ? ? ? ? ? ? ? //series1 ? ? ? ? ? ? ? ? if (chart1.Series[0].Points.Count > maxSize)? ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[0].Points.RemoveAt(0); ? ? ? ? ? ? ? ? ? ? chart1.Series[0].Points.AddXY(setX(), setY1()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? ? chart1.Series[0].Points.AddXY(setX(), setY1()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //series2 ? ? ? ? ? ? ? ? if (chart1.Series[1].Points.Count > maxSize) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[1].Points.RemoveAt(0); ? ? ? ? ? ? ? ? ? ? chart1.Series[1].Points.AddXY(setX(), setY2()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[1].Points.AddXY(setX(), setY2()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //series3 ? ? ? ? ? ? ? ? if (chart1.Series[2].Points.Count > maxSize) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[2].Points.RemoveAt(0); ? ? ? ? ? ? ? ? ? ? chart1.Series[2].Points.AddXY(setX(), setY3()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[2].Points.AddXY(setX(), setY3()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? //series4 ? ? ? ? ? ? ? ? if (chart1.Series[3].Points.Count > maxSize) ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[3].Points.RemoveAt(0); ? ? ? ? ? ? ? ? ? ? chart1.Series[3].Points.AddXY(setX(), setY4()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? chart1.Series[3].Points.AddXY(setX(), setY4()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? catch ? ? ? ? ? ? { } ? ? ? ? ? ?? ? ? ? ? } ? ? ? ?? ? ? ? ? private void timer2_Tick(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? setX(); ? ? ? ? ? ? setY1(); ? ? ? ? ? ? setY2(); ? ? ? ? ? ? setY3(); ? ? ? ? ? ? setY4(); ? ? ? ? ? ? paint(); ? ? ? ? ? ? ?//調(diào)用畫(huà)圖方法,顯示動(dòng)態(tài)折線(xiàn)圖 ? ? ? ? } ? ? ? ? private void btn_start_Click(object sender, EventArgs e) ? ? ? ? { ? ? ? ? ? ? if (btn_start.Text.Equals("開(kāi)始")) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? btn_start.Text = "停止"; ? ? ? ? ? ? ? ? timer2.Enabled = true; ? ? ? ? ? ? } ? ? ? ? ? ? else ? ? ? ? ? ? { ? ? ? ? ? ? ? ? btn_start.Text = "開(kāi)始"; ? ? ? ? ? ? ? ? timer2.Enabled = false; ? ? ? ? ? ? } ? ? ? ? } ? ? } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c# Newtonsoft 六個(gè)值得使用的特性(下)
這篇文章主要介紹了c# Newtonsoft 六個(gè)值得使用的特性,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類(lèi)當(dāng)中,可以把復(fù)雜的邏輯判斷簡(jiǎn)單化。2016-06-06C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法
這篇文章主要介紹了C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法,通過(guò)一個(gè)簡(jiǎn)單的自定義類(lèi)分析了C#實(shí)現(xiàn)SNMP的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07C#實(shí)現(xiàn)實(shí)體類(lèi)和XML相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)實(shí)體類(lèi)和XML相互轉(zhuǎn)換的資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03逐步講解快速排序算法及C#版的實(shí)現(xiàn)示例
快速排序在時(shí)間復(fù)雜度同為O(N*logN)的幾種排序方法中效率較高,因而比較常用,接下來(lái)這里就來(lái)逐步講解快速排序算法及C#版的實(shí)現(xiàn)示例2016-06-06C#通過(guò)WIN32 API實(shí)現(xiàn)嵌入程序窗體
這篇文章主要介紹了C#通過(guò)WIN32 API實(shí)現(xiàn)嵌入程序窗體的方法,涉及WIN32 API的調(diào)用及窗體的設(shè)計(jì),具有很好的借鑒價(jià)值,需要的朋友可以參考下2014-09-09