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显示即可。


  • 16
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: C表示一种编程语言中的一种数据类型,主要用于表示字符。在C语言中,字符由ASCII码表示,每个字符都对应一个唯一的ASCII码。可以使用单引号将字符括起来,例如 'a' 表示小写字母a,'A' 表示大写字母A。 C语言提供了一系列用于处理字符的函数,可以进行字符的输入、输出、比较、拷贝等操作。例如,使用scanf函数可以从键盘输入一个字符,使用printf函数可以将一个字符输出到屏幕上。 字符在计算机中存储是以ASCII码的方式进行的。在C语言中,可以使用字符常量或字符变量来表示字符。字符常量使用单引号括起来,字符变量使用字符型的变量名来表示。可以使用赋值操作符将字符常量赋给字符变量。 C语言提供了一些特殊的字符,称为转义序列。这些转义序列由反斜杠(\)和某个字符组成,表示一些特殊的字符或者控制字符。例如,'\n'表示换行符,'\t'表示制表符。 在C语言中,字符类型的变量可以进行各种运算和逻辑比较。可以将字符与整数相加、相减等操作,也可以对字符进行逻辑比较,如等于、不等于等。需要注意的是,字符型变量在进行运算时会自动转换为其对应的ASCII码进行运算。 总而言之,C语言中的C表示字符类型,用于表示一个字符。在C语言中,可以进行字符的输入、输出、比较、运算等操作。字符由ASCII码表示,可以使用字符常量或者字符变量来表示。同时,C语言还提供了一些特殊字符,称为转义序列,用于表示一些特殊的字符或者控制字符。 ### 回答2: c指的是什么?如果是C语言的话,C语言是一种通用的计算机编程语言,被广泛应用于系统软件和应用软件的开发中。 C语言是由贝尔实验室的Dennis Ritchie在20世纪70年代开发的。C语言具有高效、可移植和直接控制硬件的特点,因此成为了操作系统和编译器等重要软件工具的编程语言。 C语言的语法简洁,并且提供了丰富的库函数,便于程序员开发和调试程序。C语言的面向过程的编程范式使得其易于学习和理解,也方便了程序的维护和调试。 C语言的应用非常广泛,从嵌入式系统到大型企业级软件,都可以使用C语言进行开发。C语言还具有与其他编程语言的互操作性,可以与汇编语言、C++、Java等多种语言进行混合编程。 C语言的标准化和发展也非常活跃,现在最新的标准是C11。C语言的学习对于计算机科学相关的专业学生以及从事软件开发的人员而言非常重要,可以帮助他们理解计算机底层和开发高效的程序。 总而言之,C语言是一门非常重要的编程语言,对于科学家、工程师和程序员来说都具有重要意义。通过学习C语言,可以掌握一种通用且功能强大的编程语言,进而提高编程能力和创造力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值