C#绘制实时曲线的方法

 更新时间:2022年02月17日 10:01:10   作者:一点晴  
这篇文章主要为大家详细介绍了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#用NPOI导出导入Excel帮助类

    C#用NPOI导出导入Excel帮助类

    这篇文章主要为大家详细介绍了C# NPOI导出导入Excel帮助类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 解决WCF不能直接序列化SqlParameter类型的问题

    解决WCF不能直接序列化SqlParameter类型的问题

    这篇文章介绍了解决WCF不能直接序列化SqlParameter类型的问题,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C#、vb.net及SQL判断指定年份是否为闰年的方法

    C#、vb.net及SQL判断指定年份是否为闰年的方法

    这篇文章主要介绍了C#、vb.net及SQL判断指定年份是否为闰年的方法,分别以三种方法实现了判断闰年的功能,在进行项目开发中具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • C#实现统计字数功能的方法

    C#实现统计字数功能的方法

    这篇文章主要介绍了C#实现统计字数功能的方法,较为详细的分析了C#字数统计功能的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • .net使用cap实现消息异步处理

    .net使用cap实现消息异步处理

    CAP 是一个基于 .NET Standard 的 C# 库,它是一种处理分布式事务的解决方案,同样具有 EventBus 的功能,它具有轻量级、易使用、高性能等特点,本文给大家介绍了.net下使用cap实现消息异步处理,需要的朋友可以参考下
    2024-05-05
  • 通过C#实现裁剪PDF页面功能

    通过C#实现裁剪PDF页面功能

    在处理PDF文档时,有时需要精确地裁剪页面以适应特定需求,比如去除广告、背景信息或者仅仅是为了简化文档内容,本文将指导如何使用免费.NET控件通过C#实现裁剪PDF页面,需要的朋友可以参考下
    2024-09-09
  • 基于C#实现电脑系统挂机锁

    基于C#实现电脑系统挂机锁

    这篇文章主要为大家详细介绍了如何利用C#实现电脑系统挂机锁,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • c#使用多线程的几种方式示例详解

    c#使用多线程的几种方式示例详解

    这篇文章主要介绍了c#使用多线程的几种方式,通过示例学习c#的多线程使用方式,大家参考使用吧
    2014-01-01
  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下)

    C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下)

    本篇文章是对C#中ExpandoObject,DynamicObject,DynamicMetaOb的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 快速了解c# 结构体

    快速了解c# 结构体

    这篇文章主要介绍了c# 结构体的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07

最新评论