前陣子做了一個項目,關於繪製即時溫度、空氣濕度的動態曲線,用到了C#的動態繪製曲線,後面給大家簡單介紹一下。
解決問題的主要思路:
1.將擷取的資料作為y軸的資料,儲存在一個動態鏈表的數組DataL(List<>),這樣方便之後的插入和刪除,實現動態。
2.建立畫布節點數組pArrData;
3.繪製曲線;
4.重新整理視窗;
這裡利用隨機數簡單的示範一下:
using System;using System.Collections;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 繪製曲線{ public partial class Form1 : Form { //隨機數 private static int iSeed = 8; Random rd = new Random(iSeed); //存放資料的數組最大值 private int sizeMax; //存放y軸資料的數組鏈表 private List<int> DataL; //存放在畫布上的資料節點的數組 private Point[] pArrData; public Form1() { //初始化 InitializeComponent(); //根據畫布的寬決定x軸需要多少個數組 sizeMax = pcbDisplay.Width / 2; //資料數組 DataL = new List<int>(); pArrData = new Point[sizeMax + 1]; } private void Form1_Load(object sender, EventArgs e) { timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { DataL.Add(rd.Next(20,180)); //資料鏈表是否達到x軸最大容量的數組(動態曲線的來源) if (DataL.Count == sizeMax + 2) { DataL.RemoveAt(0);//移除鏈表第一個 } //判斷資料鏈表是否為空白 if (DataL.Count != 0) { pArrData = new Point[DataL.Count]; } //產生新的節點 for (int i = 0; i < sizeMax + 1; i++) { if (i >= DataL.Count) { break; } pArrData[i] = new Point(i * 2, DataL[i]); } pcbDisplay.Refresh(); } #region 繪製曲線 //定義畫筆 private Pen greenPen = new Pen(Color.Green, 1); private Pen redPen = new Pen(Color.Red, 1); private Pen blackPen = new Pen(Color.Black, 1); /// <summary> /// 繪製曲線 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pcbDisplay_Paint(object sender, PaintEventArgs e) { if (DataL.Count != 1) { e.Graphics.DrawCurve(greenPen, pArrData); } } #endregion }}