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#实时曲线图的资料请关注我们其它相关文章!

(0)

相关推荐

  • C#绘制曲线图的方法

    本文实例讲述了C#绘制曲线图的方法.分享给大家供大家参考.具体如下: 1. 曲线图效果: 2. C#代码: /// <summary> /// 自动根据参数调整图像大小 /// </summary> public void Fit() { //计算字体距离 intFontSpace = FontSize + 5; //计算图像边距 float fltSpace = Math.Min(Width / 6, Height / 6); XSpace = fltSpace; YSpace

  • c# 实时曲线图示例代码

    示例目的:使用时间器添加曲线图的点,以达到实时描绘曲线图的效果.X轴显示时分,Y轴显示0-20的随机数 1. 必须安装DevExpress控件,没有安装的朋友可以使用下面的链接下载安装 https://www.jb51.net/softs/547627.html 2. 新建Windows窗体应用程序,直接在工具箱搜索ChartControl并使用改组件 3. 添加曲线图,并设置其属性 当拖拉该组件到窗体设计页面时,会弹出[Chart Designer],可在此处添加曲线图,并设置其属性 3.1.

  • c# 曲线图生成代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Drawing.Imaging; using System.Collections; namespace Curve { public cl

  • 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 =

  • Matlab绘制雨云图的方法详解

    目录 介绍 横向雨云图 纵向雨云图 介绍 写了俩代码模板,用来绘制横向云雨图与纵向云雨图,云雨图其实就是用把小提琴图拆开来的模板,想获取小提琴图绘制函数的可以看这里:基于Matlab绘制小提琴图的示例代码 后面的俩模板用的时候只需要换换数据,颜色及每一类名称即可,雨云图绘制效果如下: 横向雨云图 function rainCloudsTMPL1 % @author: slandarer % 在这里放入你的数据============================================

  • Python+NumPy绘制常见曲线的方法详解

    目录 一.利萨茹曲线 二.计算斐波那契数列 三.方波 四.锯齿波和三角波 在NumPy中,所有的标准三角函数如sin.cos.tan等均有对应的通用函数. 一.利萨茹曲线 (Lissajous curve)利萨茹曲线是一种很有趣的使用三角函数的方式(示波器上显示出利萨茹曲线).利萨茹曲线由以下参数方程定义: x = A sin(at + n/2) y = B sin(bt) 利萨茹曲线的参数包括 A . B . a 和 b .为简单起见,我们令 A 和 B 均为1,设置的参数为 a=9 , b=

  • Python+matplotlib绘制多子图的方法详解

    目录 本文速览 1.matplotlib.pyplot api 方式添加子图 2.面向对象方式添加子图 3.matplotlib.pyplot add_subplot方式添加子图 4.matplotlib.gridspec.GridSpec方式添加子图 5.子图中绘制子图 6.任意位置绘制子图(plt.axes) 本文速览 matplotlib.pyplot api 绘制子图 面向对象方式绘制子图 matplotlib.gridspec.GridSpec绘制子图 任意位置添加子图 关于pyplo

  • WPF实现绘制统计图(柱状图)的方法详解

    目录 前言 实现代码 效果预览 前言 有小伙伴提出需要实现统计图. 由于在WPF中没有现成的统计图控件,所以我们自己实现一个. PS:有更好的方式欢迎推荐. 实现代码 一.创建 BasicBarChart.cs 继承 Control代码如下. BasicBarChart.cs实现思路如下 1.SeriesArray :存放展示集合 . 2.重写OnRender . 3.先绘制X轴线. 4.调用GetFormattedText()绘制底部类别. 5.调用GetFormattedText()绘制左侧

  • Linux inotify实时备份实现方法详解

    实时复制是企业数据备份最重要的方式,主要用于用户提交的数据的备份,对于用户提交到服务器上的普通文件(图片.压缩包.视频.文档等),可采用 inotify/sersync+rsync实时备份方式;对于数据文件还有较复杂的分布式存储工具自身可以实现将数据同时备份成多份,例如: FastDFS. GlusterFS等;对于提交到数据库中的数据,可使用数据库的主从复制(例如: MySQL. Oracle)方式备份,这是软件自带的实时复制备份方式.有的企业会采用更多思路实现数据同时变为多份,例如:程序业务

  • python绘制棉棒图的方法详解

    目录 案例 参数 总结 用法: matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None, basefmt=None, bottom=0, label=None, use_line_collection=True, orientation='vertical', data=None) 参数说明 参数   *args x,y,x—棉棒的x轴基线的取值范围,y—棉棒的长度 linefmt 棉棒的样式,{‘-’,’–’,’:’,’-.’},包

  • Android绘制旋转动画方法详解

    目录 1.准备工作 2.加速减速原理 3.初始化 4.开始 5.加速 6.减速 7.停止 8.项目源码 Layout部分 MainActivity部分 1.准备工作 首先需要有一个用于旋转的图片 需要考虑如何开始.结束.加速.减速 2.加速减速原理 本次的动画采用RotateAnimation,初始化需要的参数如下 public RotateAnimation(float fromDegrees,float toDegrees,int pivotXType,float pivotXValue,i

  • Matlab绘制酷炫坐标区域的方法详解

    目录 使用方式 其他炫酷的背景 注意事项 代码展示及mat文件获取 写了一个能让坐标区域变得很炫酷的修饰函数: 同时想到了一个很有意思的把函数存储进mat文件的方法,方法就不细讲了,大家自行点开.mat文件能够很轻松的理解原理(大概), 使用方式 首先说明一下函数咋用:假设编写了如下函数: t=0:0.35:3*pi; plot(t,sin(t),'Marker','d','LineWidth',2,'Color',[102,194,166]./255) hold on plot(t,cos(t

  • EasyX绘制透明背景图的方法详解

    目录 三元光栅操作 优化方案 三元光栅操作 根据在网上的搜索总结得到两种方案,最常见的绘制带有透明背景的图像的方案都是采用如下的源图像和掩码图像叠加来消去边缘部分: IMAGE img[2]; loadimage(&img[0], "sun1.png", 100, 100); // 掩码图像 loadimage(&img[1], "sun0.png", 100, 100); // 源图像 putimage(0, 0, &img[0], NOT

随机推荐