好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#绘制实时曲线的方法

本文实例为大家分享了C#绘制实时曲线的具体代码,供大家参考,具体内容如下

1.要做一个调试工具,采集传感器数据并显示。绘制曲线注意坐标反转,线条的张力即可。项目中的曲线是从右往左显示的,线条的坐标都放在list里了,效果如下图:

2.上代码

public class DrawingCurve ? ? { ? ? ? ? private Graphics graphics; //Graphics 类提供将对象绘制到显示设备的方法 ? ? ? ? private Bitmap bitmap; //位图对象 ? ? ? ? private int timeLine = 60;//60s ? ? ? ? private int canvasWidth = 600;//画布长度 ? ? ? ? private int sliceCount = 0;//刻度分段个数 = timeLine ? ? ? ? private int xSlice = 10;//X轴刻度分端宽度 ? ? ? ? private int xSliceHeight = 10;//X轴刻度高度 ? ? ? ? private float tension = 0.5f; //张力系数 ? ? ? ? private bool showX = true; ? ? ? ? private bool showY = true; ? ? ? ? private bool showZ = true; ? ? ? ? ? //Queue<PointF> que = new Queue<PointF>();//曲线fifo ? ? ? ? /// <summary> ? ? ? ? /// 构造函数 ? ? ? ? /// </summary> ? ? ? ? public DrawingCurve() { ? ? ? ? ? ? this.xSlice = this.canvasWidth / timeLine; ? ? ? ? } ? ? ? ? ? /// <summary> ? ? ? ? /// 绘制画布 ? ? ? ? /// </summary> ? ? ? ? /// <param name="width"></param> ? ? ? ? /// <param name="height"></param> ? ? ? ? /// <param name="points"></param> ? ? ? ? /// <returns></returns> ? ? ? ? public Bitmap DrawCanvas(int width, int height,List<float> points) ? ? ? ? { ? ? ? ? ? ? if (bitmap != null) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? bitmap.Dispose(); ? ? ? ? ? ? ? ? bitmap = null; ? ? ? ? ? ? } ? ? ? ? ? ? ? bitmap = new Bitmap(width, height); ? ? ? ? ? ? graphics = Graphics.FromImage(bitmap); ? ? ? ? ? ? graphics.FillRectangle(Brushes.Black, new Rectangle(0, 0, width, height)); ? ? ? ? ? ? graphics.Transform = new Matrix(1, 0, 0, -1, 0, 0);//Y轴向上为正,X向右为 ? ? ? ? ? ? graphics.TranslateTransform(0, height / 2, MatrixOrder.Append); ? ? ? ? ? ?? ? ? ? ? ? ? Pen pen = new Pen(Color.Red, 1); ? ? ? ? ? ? pen.DashStyle = DashStyle.Custom; ? ? ? ? ? ? pen.DashPattern = new float[] { 2, 2 }; ? ? ? ? ? ? graphics.DrawLine(pen, new Point(0, height / 4), new Point(width, height / 4)); ? ? ? ? ? ? graphics.DrawLine(pen, new Point(0, height / -4), new Point(width, height / -4)); ? ? ? ? ? ? graphics.DrawLine(new Pen(Color.GreenYellow,1), new Point(0, 0), new Point(width, 0)); ? ? ? ? ? ? graphics.DrawString("0", new Font("Vendara",10), Brushes.White, new Point(0, -15)); ? ? ? ? ? ? graphics.DrawString("+", new Font("Vendara", 10), Brushes.White, new Point(0, height / 4)); ? ? ? ? ? ? graphics.DrawString("-", new Font("Vendara", 10), Brushes.White, new Point(0, height / -4-15)); ? ? ? ? ? ? graphics.Transform = new Matrix(1, 0, 0, 1, 0, 0);//Y轴向上为正,X向右为 ? ? ? ? ? ? graphics.TranslateTransform(0, height / 2, MatrixOrder.Append); ? ? ? ? ? ? graphics.DrawString("-59s", new Font("Vendara", 8), Brushes.White, new Point(0, height/2-15)); ? ? ? ? ? ? graphics.DrawString("0s", new Font("Vendara", 8), Brushes.White, new Point(width-20, height / 2 - 15)); ? ? ? ? ? ? for (int i = 0; i < timeLine; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? int scale = i * xSlice; ? ? ? ? ? ? ? ? graphics.DrawLine(new Pen(new SolidBrush(Color.Blue)), 0 + scale, 0 + xSliceHeight * 0.1f, 0 + scale, 0 - xSliceHeight * 0.1f); ? ? ? ? ? ? } ? ? ? ? ? ? ? graphics.Transform = new Matrix(-1, 0, 0, -1, 0, 0);//Y轴向上为正,X向右为 ? ? ? ? ? ? graphics.TranslateTransform(width, height / 2, MatrixOrder.Append); ? ? ? ? ? ? ? if (showX) DrawX(graphics, points); ? ? ? ? ? ? if (showY) DrawY(graphics, points); ? ? ? ? ? ? if (showZ) DrawZ(graphics, points); ? ? ? ? ? ? graphics.Dispose(); ? ? ? ? ? ? return bitmap; ? ? ? ? } ? ? ? ? ? #region 绘制曲线 ? ? ? ? private void DrawX(Graphics graphics, List<float> points) ? ? ? ? { ? ? ? ? ? ? Pen CurvePen = new Pen(Color.Cyan, 2); ? ? ? ? ? ? PointF[] CurvePointF = new PointF[points.Count]; ? ? ? ? ? ? float keys = 0; ? ? ? ? ? ? float values = 0; ? ? ? ? ? ? for (int i = 0; i < points.Count; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? keys = xSlice * i; ? ? ? ? ? ? ? ? values = 10 * (points[i] / 10); ? ? ? ? ? ? ? ? CurvePointF[i] = new PointF(keys, values); ? ? ? ? ? ? } ? ? ? ? ? ? graphics.DrawCurve(CurvePen, CurvePointF, this.tension); ? ? ? ? } ? ? ? ? ? private void DrawY(Graphics graphics, List<float> points) ? ? ? ? { ? ? ? ? ? ? Pen CurvePen = new Pen(Color.Purple, 2); ? ? ? ? ? ? PointF[] CurvePointF = new PointF[points.Count]; ? ? ? ? ? ? float keys = 0; ? ? ? ? ? ? float values = 0; ? ? ? ? ? ? for (int i = 0; i < points.Count; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? keys = xSlice * i; ? ? ? ? ? ? ? ? values = 10 * (points[i] / 10); ? ? ? ? ? ? ? ? CurvePointF[i] = new PointF(keys, values); ? ? ? ? ? ? } ? ? ? ? ? ? graphics.DrawCurve(CurvePen, CurvePointF, this.tension); ? ? ? ? } ? ? ? ? ? private void DrawZ(Graphics graphics, List<float> points) ? ? ? ? { ? ? ? ? ? ? Pen CurvePen = new Pen(Color.OrangeRed, 2); ? ? ? ? ? ? PointF[] CurvePointF = new PointF[points.Count]; ? ? ? ? ? ? float keys = 0; ? ? ? ? ? ? float values = 0; ? ? ? ? ? ? for (int i = 0; i < points.Count; i++) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? keys = xSlice * i; ? ? ? ? ? ? ? ? values = 10 * (points[i] / 10); ? ? ? ? ? ? ? ? CurvePointF[i] = new PointF(keys, values); ? ? ? ? ? ? } ? ? ? ? ? ? graphics.DrawCurve(CurvePen, CurvePointF, this.tension); ? ? ? ? } ? ? ? ? ? /// <summary> ? ? ? ? /// 曲线开关 ? ? ? ? /// </summary> ? ? ? ? /// <param name="_xyz"></param> ? ? ? ? /// <param name="show"></param> ? ? ? ? public void HideCurve(string _xyz,bool show) { ? ? ? ? ? ? switch (_xyz) {? ? ? ? ? ? ? ? ? case "x": ? ? ? ? ? ? ? ? ? ? showX = show; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case "y": ? ? ? ? ? ? ? ? ? ? showY = show; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case "z": ? ? ? ? ? ? ? ? ? ? showZ = show; ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? default: ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? ? #endregion ? ? }

3.UI上使用ThreadStart进行调用,根据需要设置休眠时间即可,同时设置pictureBox显示即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

查看更多关于C#绘制实时曲线的方法的详细内容...

  阅读:57次