zoukankan      html  css  js  c++  java
  • C#制作曲线图源码

    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using System.Drawing; 
    using System.Drawing.Imaging; 
     
    namespace RealtimeCurve 

        /// <SUMMARY> 
        /// 说明:实时图片生成类,在本例中横向坐标上每个像素都会有一个控制点 
        /// 实际开发中可以减少控制点,比如每5个像素用一个控制点 
        /// 这样的效果或许更加逼真 
        /// 作者:周公 
        /// 日期:2008-07-21 
        /// 首发地址:<A href="http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx">http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx</A> 
        /// </SUMMARY> 
        public class RealTimeImageMaker 
        { 
            private int width;//要生成的曲线图的宽度 
            private int height;//要生成的曲线图的高度 
            private Point[] pointList;//用来绘制曲线图的关键点,依次将这些点连接起来即得到曲线图 
            private Random random = new Random();//用于生成随机数 
            private Bitmap currentImage;//当前要绘制的图片 
            private Color backColor;//图片背景色 
            private Color foreColor;//图片前景色 
            /// <SUMMARY> 
            /// 图片的高度 
            /// </SUMMARY> 
            public int Height 
            { 
                get { return height; } 
                set { height = value; } 
            } 
         
            /// <SUMMARY> 
            /// 图片的宽度 
            /// </SUMMARY> 
            public int Width 
            { 
                get { return width; } 
                set { width = value; } 
            } 
            /// <SUMMARY> 
            /// 构造函数,指定生成的曲线图的宽度和高度 
            /// </SUMMARY> 
            /// <PARAM name="width">要生成的曲线图的宽度</PARAM> 
            /// <PARAM name="height">要生成的曲线图的高度</PARAM> 
            public RealTimeImageMaker(int width, int height):this(width,height,Color.Gray,Color.Blue) 
            { 
                 
            } 
            /// <SUMMARY> 
            /// 构造函数,指定生成的曲线图的宽度、高度及背景色和前景色 
            /// </SUMMARY> 
            /// <PARAM name="width">要生成的曲线图的宽度</PARAM> 
            /// <PARAM name="height">要生成的曲线图的高度</PARAM> 
            /// <PARAM name="backColor">曲线图背景色</PARAM> 
            /// <PARAM name="foreColor">曲线图前景色</PARAM> 
            public RealTimeImageMaker(int width, int height, Color backColor, Color foreColor) 
            { 
                this.width = width; 
                this.height = height; 
                this.backColor = backColor; 
                this.foreColor = foreColor; 
                pointList = new Point[width]; 
                Point tempPoint; 
                //初始化曲线上的所有点坐标 
                for (int i = 0; i < width; i++) 
                { 
     
                    tempPoint = new Point(); 
                    //曲线的横坐标沿x轴依次递增,在横向位置上每个像素都有一个点 
                    tempPoint.X = i; 
                    //曲线上每个点的纵坐标随机生成,但保证在显示区域之内 
                    tempPoint.Y = random.Next() % height; 
                    pointList[i] = tempPoint; 
                } 
            } 
            /// <SUMMARY> 
            /// 获取当前依次连接曲线上每个点绘制成的曲线 
            /// </SUMMARY> 
            /// <RETURNS></RETURNS> 
            public Image GetCurrentCurve() 
            { 
                //currentImage = historyImage.Clone(new Rectangle(1, 0, width - 1, height), PixelFormat.Format24bppRgb); 
                currentImage = new Bitmap(width, height); 
                Point p; 
                //将当前定位曲线图的坐标点前移,并且将横坐标减1, 
                //这样做的效果相当于移除当前第一个点 
                for (int i = 0; i < width-1; i++) 
                { 
                    p = pointList[i + 1]; 
                    pointList[i] = new Point(p.X-1,p.Y); 
                } 
                Point tempPoint = new Point(); 
                //新生成曲线图定位点的最后一个点的坐标 
                tempPoint.X = width; 
                //曲线上每个点的纵坐标随机生成,但保证在显示区域之内 
                tempPoint.Y = random.Next(DateTime.Now.Millisecond) % height; 
                //在最后再添加一个新坐标点 
                pointList[width-1]=tempPoint; 
                Graphics g = Graphics.FromImage(currentImage); 
                g.Clear(backColor); 
                //绘制曲线图 
                g.DrawLines(new Pen(foreColor), pointList); 
                g.Dispose(); 
                return currentImage; 
            } 
        } 
    }
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Imaging;
    namespace RealtimeCurve
    {
        ///
        /// 说明:实时图片生成类,在本例中横向坐标上每个像素都会有一个控制点
        /// 实际开发中可以减少控制点,比如每5个像素用一个控制点
        /// 这样的效果或许更加逼真
        /// 作者:周公
        /// 日期:2008-07-21
        /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx
        ///
        public class RealTimeImageMaker
        {
            private int width;//要生成的曲线图的宽度
            private int height;//要生成的曲线图的高度
            private Point[] pointList;//用来绘制曲线图的关键点,依次将这些点连接起来即得到曲线图
            private Random random = new Random();//用于生成随机数
            private Bitmap currentImage;//当前要绘制的图片
            private Color backColor;//图片背景色
            private Color foreColor;//图片前景色
            ///
            /// 图片的高度
            ///
            public int Height
            {
                get { return height; }
                set { height = value; }
            }
     
            ///
            /// 图片的宽度
            ///
            public int Width
            {
                get { return width; }
                set { width = value; }
            }
            ///
            /// 构造函数,指定生成的曲线图的宽度和高度
            ///
            /// 要生成的曲线图的宽度
            /// 要生成的曲线图的高度
            public RealTimeImageMaker(int width, int height):this(width,height,Color.Gray,Color.Blue)
            {
              
            }
            ///
            /// 构造函数,指定生成的曲线图的宽度、高度及背景色和前景色
            ///
            /// 要生成的曲线图的宽度
            /// 要生成的曲线图的高度
            /// 曲线图背景色
            /// 曲线图前景色
            public RealTimeImageMaker(int width, int height, Color backColor, Color foreColor)
            {
                this.width = width;
                this.height = height;
                this.backColor = backColor;
                this.foreColor = foreColor;
                pointList = new Point[width];
                Point tempPoint;
                //初始化曲线上的所有点坐标
                for (int i = 0; i < width; i++)
                {
                    tempPoint = new Point();
                    //曲线的横坐标沿x轴依次递增,在横向位置上每个像素都有一个点
                    tempPoint.X = i;
                    //曲线上每个点的纵坐标随机生成,但保证在显示区域之内
                    tempPoint.Y = random.Next() % height;
                    pointList[i] = tempPoint;
                }
            }
            ///
            /// 获取当前依次连接曲线上每个点绘制成的曲线
            ///
            ///
            public Image GetCurrentCurve()
            {
                //currentImage = historyImage.Clone(new Rectangle(1, 0, width - 1, height), PixelFormat.Format24bppRgb);
                currentImage = new Bitmap(width, height);
                Point p;
                //将当前定位曲线图的坐标点前移,并且将横坐标减1,
                //这样做的效果相当于移除当前第一个点
                for (int i = 0; i < width-1; i++)
                {
                    p = pointList[i + 1];
                    pointList[i] = new Point(p.X-1,p.Y);
                }
                Point tempPoint = new Point();
                //新生成曲线图定位点的最后一个点的坐标
                tempPoint.X = width;
                //曲线上每个点的纵坐标随机生成,但保证在显示区域之内
                tempPoint.Y = random.Next(DateTime.Now.Millisecond) % height;
                //在最后再添加一个新坐标点
                pointList[width-1]=tempPoint;
                Graphics g = Graphics.FromImage(currentImage);
                g.Clear(backColor);
                //绘制曲线图
                g.DrawLines(new Pen(foreColor), pointList);
                g.Dispose();
                return currentImage;
            }
        }
    }窗体关键代码:
    view plaincopy to clipboardprint?
    using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Text; 
    using System.Windows.Forms; 
    using System.Threading; 
     
    namespace RealtimeCurve 

        /// <SUMMARY> 
        /// 说明:显示实时曲线图的窗体 
        /// 作者:周公 
        /// 日期:2008-07-21 
        /// 首发地址:<A href="http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx">http://blog.csdn.net/zhoufoxcn/archive/2008/07/21/2682027.aspx</A> 
        /// </SUMMARY> 
        public partial class FormRealTime : Form 
        { 
            Thread thread; 
            RealTimeImageMaker rti; 
            Color backColor = Color.Black;//指定绘制曲线图的背景色 
            public FormRealTime() 
            { 
                InitializeComponent(); 
                rti = new RealTimeImageMaker(Width, Height, backColor, Color.Green); 
                thread = new Thread(new ThreadStart(Run)); 
                thread.Start(); 
            } 
     
            private void Run() 
            { 
                while (true) 
                { 
                    Image image = rti.GetCurrentCurve(); 
                    Graphics g = CreateGraphics(); 
                    //用指定背景色清除当前窗体上的图象 
                    g.Clear(backColor); 
                    g.DrawImage(image, 0, 0); 
                    g.Dispose(); 
                    //每秒钟刷新一次 
                    Thread.Sleep(1000); 
                } 
            } 
     
            private void FormRealTime_FormClosing(object sender, FormClosingEventArgs e) 
            { 
                //在窗体即将关闭之前中止线程 
                thread.Abort(); 
            } 
        } 

  • 相关阅读:
    ios学习记录 day45 UI21 特效动画
    ios学习记录 day44 UI20 Storyboard 高级可视化编程 + 单例
    ios学习记录 day43 UI19 标签视图 和 block用法
    ios学习记录 day42 UI18 集合视图
    ios学习记录 day41 UI17 多线程
    7-2 How Many Ways to Buy a Piece of Land (25 分)
    7-1 Panda and PP Milk (20 分)
    1146 Topological Order (25 分)
    1089 Insert or Merge (25 分) 归并排序
    1098 Insertion or Heap Sort (25 分) 堆
  • 原文地址:https://www.cnblogs.com/jishu/p/1940059.html
Copyright © 2011-2022 走看看