C#動(dòng)態(tài)繪制多條曲線的方法
本文實(shí)例為大家分享了C#動(dòng)態(tài)繪制多條曲線的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)時(shí)繪制多條曲線,縱軸為數(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)折線圖
? ? ? ? }
? ? ? ? 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-06
C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類當(dāng)中,可以把復(fù)雜的邏輯判斷簡(jiǎn)單化。2016-06-06
C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法
這篇文章主要介紹了C#簡(jiǎn)單實(shí)現(xiàn)SNMP的方法,通過(guò)一個(gè)簡(jiǎn)單的自定義類分析了C#實(shí)現(xiàn)SNMP的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
C#實(shí)現(xiàn)實(shí)體類和XML相互轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)實(shí)體類和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-06
C#通過(guò)WIN32 API實(shí)現(xiàn)嵌入程序窗體
這篇文章主要介紹了C#通過(guò)WIN32 API實(shí)現(xiàn)嵌入程序窗體的方法,涉及WIN32 API的調(diào)用及窗體的設(shè)計(jì),具有很好的借鑒價(jià)值,需要的朋友可以參考下2014-09-09

