C#绘制实时曲线图的方法详解

 更新时间:2022年02月26日 10:22:17   作者:dawn  
这篇文章主要为大家详细介绍了如何利用C#绘制实时曲线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在终端机器上的曲线显示本打算用控件,可控件折腾好长时间也没弄顺,还是自己写的好使,记录下来后面再改进。

        //绘图部分的定义
        Int32 Draw_Top;//绘画Y起点
        Int32 Draw_Left;//绘画X起点
        Int32 Draw_EdgeWidth;//X边缘宽度
        Int32 Draw_EdgeHeight;//Y边缘高度
        Int32 Draw_RangeWidth;//绘画范围宽度
        Int32 Draw_RangeHeight;//绘画范围高度
        Double[] XTDYData = new Double[21];
        Int32 ICountDraw=0;
        
        Int32 IActualWidth, IActualHeight;
        Int32 Draw_AdjustX = 20;
        Int32 Draw_AdjustY = 20;
        Point StartPoint = new Point();
        Point EndPoint = new Point();
        Point ZeroPoint = new Point();
        Int32 IScalesY = 11;
        Int32 IScalesX = 21;
        Int32 IIncrementX;
 
        Pen pSpecial = new Pen(Color.Black,1);
        Pen pCommon = new Pen(Color.Black,2);
        Font FontTitle = new Font("微软雅黑", 12);//写标题的字体
        Font FontText = new Font("微软雅黑", 9);//写正文的字体           
        SolidBrush SBTitle = new SolidBrush(Color.Red);
        SolidBrush SBText = new SolidBrush(Color.Black);

在数据接收的事件中进行曲线绘制:

                    //显示趋势图
                    ICountDraw = ICountDraw + 1;
                    if (ICountDraw ==21)
                    {
                        for (int i=1;i<21;i++)
                        {
                            XTDYData[i - 1] = XTDYData[i];
                        }
                        XTDYData[20]= YBDWDealWithData.TYNDianYa.dValue;
                        ICountDraw = 20;
                    }
                    else
                    {
                        XTDYData[ICountDraw] = YBDWDealWithData.TYNDianYa.dValue;
                    }
                    FuncDrawYBDW();

下面是基础函数:

        public void FuncDrawYBDW() {
            Bitmap bmp = new Bitmap(Draw_RangeWidth, Draw_RangeHeight);//定义画布的大小
            Graphics graphics = Graphics.FromImage(bmp);
            FuncDrawBasePic(ref graphics);
            FuncDrawDynamicPic(ref graphics);
            Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
            g.DrawImage(bmp, new Point(0, 0));//在内存中画完后显示在pictureBox1上,避免闪烁
        }
 
        public void FuncDrawBasePic(ref Graphics YBDWCanvas)
        {
            //绘制基础
            //画一个方框
            YBDWCanvas.FillRectangle(Brushes.WhiteSmoke, Draw_Top, Draw_Left, Draw_RangeWidth, Draw_RangeHeight);
            //画坐标轴X
            pCommon.Width = 2;
            pCommon.Color = Color.Black;
            StartPoint.X = Draw_Left + Draw_AdjustX;
            StartPoint.Y = Draw_Top + Draw_RangeHeight - Draw_AdjustY * 2;
            EndPoint.X = Draw_Left + Draw_RangeWidth - Draw_AdjustX * 2;
            EndPoint.Y = Draw_Top + Draw_RangeHeight - Draw_AdjustY * 2;
            YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
            IActualWidth = EndPoint.X - StartPoint.X;
            YBDWCanvas.DrawString("X", FontText, SBText, EndPoint.X, EndPoint.Y - 8);
            //画箭头
            StartPoint.X = EndPoint.X - 8;
            StartPoint.Y = EndPoint.Y - 4;
            YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
            StartPoint.X = EndPoint.X - 8;
            StartPoint.Y = EndPoint.Y + 4;
            YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
            //画坐标轴Y
            pCommon.Width = 2;
            pCommon.Color = Color.Black;
            StartPoint.X = Draw_Left + Draw_AdjustX;
            StartPoint.Y = Draw_Top + Draw_AdjustY;
            EndPoint.X = Draw_Left + Draw_AdjustX;
            EndPoint.Y = Draw_Top + Draw_RangeHeight - Draw_AdjustY * 2;
            YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
            IActualHeight = EndPoint.Y - StartPoint.Y;
            ZeroPoint = EndPoint;
            //画画箭头
            EndPoint.X = StartPoint.X - 4;
            EndPoint.Y = StartPoint.Y + 8;
            YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
            EndPoint.X = StartPoint.X + 4;
            EndPoint.Y = StartPoint.Y + 8;
            YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
            YBDWCanvas.DrawString("Y", FontText, SBText, EndPoint.X, EndPoint.Y - 8);
            //画X刻度
            pSpecial.Width = 1;
            pSpecial.DashStyle = DashStyle.Custom;
            pSpecial.DashPattern = new float[] { 1f, 1f };
            IIncrementX = IActualWidth / IScalesX;
            for (int i = 1; i < IScalesX; i = i + 1)
            {
                StartPoint.X = ZeroPoint.X + IIncrementX * i;
                StartPoint.Y = ZeroPoint.Y - 2;
                EndPoint.X = StartPoint.X;
                EndPoint.Y = StartPoint.Y - IActualHeight - 2;
                YBDWCanvas.DrawLine(pSpecial, StartPoint, EndPoint);
                //写标识字
                if (i % 2 == 0)
                {
                    YBDWCanvas.DrawString(i.ToString(), FontText, SBText, StartPoint.X - 6, StartPoint.Y + 4);
                }
            }
 
            //画Y刻度
            Int32 IIncrementY = IActualHeight / IScalesY;
            for (int i = 1; i < IScalesY; i = i + 1)
            {
                StartPoint.X = ZeroPoint.X;
                StartPoint.Y = ZeroPoint.Y - IIncrementY * i;
                EndPoint.X = StartPoint.X + IActualWidth;
                EndPoint.Y = StartPoint.Y;
                YBDWCanvas.DrawLine(pSpecial, StartPoint, EndPoint);
                //写标识字
                if (i % 2 == 0)
                {
                    YBDWCanvas.DrawString((i - 1).ToString(), FontText, SBText, StartPoint.X - 12, StartPoint.Y + 4);
                }
            }
            //写标题
            //Rectangle YBDWMessRect = new Rectangle(SX, SY, MessageDotRadius * 2, MessageDotRadius * 2);//圆的大小
            //YBDWCanvas.FillEllipse(SBTitle, YBDWMessRect);
            //画连接线
            YBDWCanvas.DrawString(SDrawTitle, FontTitle, SBTitle, 100,30);
 
        }
 
        public void FuncDrawDynamicPic(ref Graphics YBDWCanvas)
            {
            //准备实际画线的数据
            Point[] XTDYPoints =new Point[21];//系统电压数据
            for (int i = 0; i < IScalesX; i = i + 1)
            {
                    XTDYPoints[i].X = ZeroPoint.X + IIncrementX * i;
                    XTDYPoints[i].Y = ZeroPoint.Y - (int)((XTDYData[i]/IActualHeight)*6000);
            }
            pSpecial.Width = 3;
            pSpecial.Color = Color.Red;
            YBDWCanvas.DrawCurve(pSpecial, XTDYPoints, 3.0F);
        }

实际效果图:

点选不同的文字进行相应的实时动态图的显示。

以上就是C#绘制实时曲线图的方法详解的详细内容,更多关于C#实时曲线图的资料请关注脚本之家其它相关文章!

相关文章

  • C#新手常犯的错误汇总

    C#新手常犯的错误汇总

    这篇文章主要介绍了C#新手常犯的错误汇总,对于经验丰富的C#程序员同样具有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • C# 计算标准偏差相当于Excel中的STDEV函数实例

    C# 计算标准偏差相当于Excel中的STDEV函数实例

    下面小编就为大家带来一篇C# 计算标准偏差相当于Excel中的STDEV函数实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#图像亮度调式与伪彩色图的处理教程(推荐)

    C#图像亮度调式与伪彩色图的处理教程(推荐)

    下面小编就为大家推荐一篇C#图像亮度调式与伪彩色图的处理教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-11-11
  • P/Invoke之C#调用动态链接库DLL示例详解

    P/Invoke之C#调用动态链接库DLL示例详解

    这篇文章主要为大家介绍了P/Invoke之C#调用动态链接库DLL示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • C#多线程系列之原子操作

    C#多线程系列之原子操作

    本文详细讲解了C#多线程的原子操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 基于C#实现语音识别功能详解

    基于C#实现语音识别功能详解

    在.NET4.0中,可以借助System.Speech组件让电脑来识别我们的声音。本文将利用该组件实现语音识别功能,文中实现过程讲解详细,需要的可以参考一下
    2022-04-04
  • C#使用正则表达式

    C#使用正则表达式

    这篇文章介绍了C#使用正则表达式的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#实现读取Word表格到DataSet

    C#实现读取Word表格到DataSet

    在应用项目里,多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求,但某些情况下,也存在使用 Word 进行表格数据编辑的情况,这其中也包括导入Word内容的功能,比如表格数据导出到DataSet数据集,本文将给大家介绍了C#读取Word表格到DataSet
    2023-12-12
  • c# 开发文字识别软件

    c# 开发文字识别软件

    这篇文章主要介绍了c# 开发文字识别软件的方法,帮助大家更好的利用c#进行文字识别,感兴趣的朋友可以了解下
    2020-12-12
  • C# BackgroundWorker使用教程

    C# BackgroundWorker使用教程

    这篇文章主要为大家详细介绍了C# BackgroundWorker使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论