zoukankan      html  css  js  c++  java
  • NET简单的一个画图程序

    using System;
    using System.Drawing;
    //HttpUtility.UrlEncode
    
    /// <summary>
    ///Curve 的摘要说明
    /// </summary>
    public class Curve
    {
        public Curve()
        {
            //
            //TODO: 在此处添加构造函数逻辑
            //
        }
    
        /*******************************************************属性设置**************************************************************/
        /// <summary>
        /// 房价数组
        /// </summary>
            private string[]  _CurveData;
        /// <summary>
        /// 房价时间
        /// </summary>
            //private string[] _CurveDate;
            public string[] CurveData
            {
            get { return _CurveData; }
            set { _CurveData = value; }
            }
            //public string[] CurveDate
            //{
            //    get { return _CurveDate; }
            //    set { _CurveDate = value; }
            //}
    
        /// <summary>
        /// 是否显示曲线
        /// </summary>
        private bool _IsDemonstrationCurve=true;
        public bool IsDemonstrationCurve
        {
            get { return _IsDemonstrationCurve;}
            set {
                if(value==false)
                {
                    _IsDemonstrationCurve = false;
                }else
                {
                    _IsDemonstrationCurve = true;
                }
    
            }
        }
        /// <summary>
        /// 是否显示 矩形图
        /// </summary>
        private bool _IsDemonstrationRectangle=true;
        public bool IsDemonstrationRectangle
        {
            get { return _IsDemonstrationRectangle; }
            set
            {
                if(value==false)
                {
                    _IsDemonstrationRectangle = false;
                }else
                {
                    _IsDemonstrationRectangle = true;
                }
            }
    
    
        }
        /*****************************************属性设置结束***********************************************************************************/
    
        
    
        public bool getCurve(string FileName)
        {
    
            try
            {
                /***********************大图的参数*****************************/
                /*自写编码*/
                int ImgWidth = 900; //1.[总宽度]            ***图宽度   
                int ImgHeight = 550; //2.[总高度]            ***图高度        
                int ItemNum = 1; //3.[项目数量]            ***图表划分的块     
                //int ChildSpace=15;        //6.[各块间的间距]
                int ChartLeft = 80; //7.[图表左边距]        ***图表距图的左边距离
                int ChartRight = 50; //8.[图表右边距]        ***图表距图的右边距离
                int ChartTop = 50; //9.[图表顶边距]        ***图表距图顶边距离
                int ChartBottom = 50; //10.[图表底边距]        ***图表距图底边距离
    
                /*************************坐标位置调整******************************************/
                int YMaxValue = 8000; //11.[纵坐标标尺最大值]    ***纵坐标标尺的最大值
                int YItemNum = 15; //12.[纵坐标标尺段数]    ***纵坐标标尺的段数
                int YTop = 15; //13.[距纵轴顶端间隔]
                int YStrStart = 35; //14.[纵坐标标尺文字起始X坐标]
                int XRight = 15; //15.[距横轴右端间隔]
                int XStrStart = 20; //16.[横坐标标尺文字起始Y坐标]
    
    
                /*************************小刻度位置调整*********************************/
                int ChildNum = 4; //4.[块数]                ***大块中划分的子项的数量
                float ChildRate = 0.6f; //5.[各块总占空间比率]
                int xiaoSpacing = 80; //小标示和小刻度之间的距离
                int Xxiaospace_between = 35; //矩形距离小刻度的位置
                int intjiange = 300; //顶部名称说明距离 左边的距离
    
    
                string[] strGIFName = new string[ItemNum]; //大标示  注意和项目个数有联系
                //string strGIFName = "2009年价格走势图";
                /*因为 最近要换 所以 只有今年的*/
                for (int intGIF = 1; intGIF <= ItemNum; intGIF++)
                {
    
                    strGIFName[intGIF - 1] = 2008 + intGIF + "年价格走势图";
                    // arrValueNames[1] = "2010年价格走势图";
                    // arrValueNames[2] = "2011年价格走势图"; 
                }
    
    
                /*****************************各项数值的计算****************************************/
                //[图表总宽度]=[总宽度]-[图表左边距]-[图表右边距]-[距横轴右端间隔]
                int chartwidth = ImgWidth - ChartLeft - ChartRight - XRight;
                //[项目宽度]=[图表总宽度]/[项目数量]
                int itemwidth = chartwidth/ItemNum;
                //[各块总占空间比率的实际宽度]=[项目宽度]*[各块总占空间比率]
                int factwidth = Convert.ToInt32(Math.Floor(itemwidth*ChildRate));
                //[各块矩形宽度]=[各块总占空间比率的实际宽度]/[块数]
                int rectanglewidth = factwidth/ChildNum;
                //[各块间的间距]=([项目宽度]-[各块总占空间比率的实际宽度])/([块数]+1)
                int falge = ((itemwidth - factwidth)/(ChildNum + 1));
                decimal myFale = falge;
                int childspace = Convert.ToInt32(Math.Floor(myFale));
                //(itemwidth-factwidth)/(ChildNum+1)
    
                /***********************************开始画图******************************************************/
                Graphics objGps; //建立画板对象
                Bitmap objBitMap = new Bitmap(ImgWidth, ImgHeight); //建立位图对象
                objGps = Graphics.FromImage(objBitMap); //根据位图对象建立画板对象
                objGps.Clear(Color.White); //设置画板对象的背景色
                /***************************横坐标设置*************************************************/
                string[] strArrValueName = new string[ChildNum]; //标示名称(月份)         注意长度要和ChildNum 相同 //横坐标设置
                for (int intquarter = 1; intquarter <= strArrValueName.Length; intquarter++)
                {
                    if (intquarter%4 == 1)
                    {
                        strArrValueName[intquarter - 1] = "1~3月";
                    }
                    if (intquarter%4 == 2)
                    {
                        strArrValueName[intquarter - 1] = "4~6月";
                    }
                    if (intquarter%4 == 3)
                    {
                        strArrValueName[intquarter - 1] = "7~9月";
                    }
                    if (intquarter%4 == 0)
                    {
                        strArrValueName[intquarter - 1] = "10~12月";
                    }
                }
    
                /****************************数据的赋值*******************************/
                /*********************************************************************/
                //显示的数据
                int[] arrValues = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //数据数组
                  //CurveData
    
                for (int inttheNum = 0; inttheNum <ChildNum; inttheNum++)
                {
    
                    /*  (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i   纵坐标的计算方法 */
                    //ImgHeight - ChartBottom - ChartTop - YTop 总高度-距离顶部高度-距离底部高度-y坐标距离顶部高度/标示个数个数=单个坐标的高度
                    // ImgHeight - ChartBottom-单个坐标的高度     总高度-距离底部高度-单个项目的高度
                    double dange = (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum; //单个高度的计算             
                   
                    double floatfalge = (double.Parse(CurveData[inttheNum])) * dange;
                    // double floatfalge = (ImgHeight - ChartBottom - ChartTop - YTop)*(inttheNum + 1)*400/YMaxValue;
                    arrValues[inttheNum] = Convert.ToInt32(Math.Floor(floatfalge));
                }
    
    
                /***************************************纵坐标显示标示设置*******************************************/
                //string[] arrValueNames = {"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"}; 
                string[] arrValueNames = new string[YItemNum]; //这里表示所有的纵坐标的标示度名称
                for (int intValueName = 0; intValueName < arrValueNames.Length; intValueName++)
                {
                    arrValueNames[intValueName] = ((intValueName*500) + 2000).ToString();
                }
    
    
    
    
                //得出矩形宽度,和画图X轴位置
    
                //[项目宽度]=[总宽度]/[项目数量]
                //======[各块总占空间比率]=([各块矩形宽度]+[各块间的间距])/[项目宽度]
                //[各块总占空间比率的实际宽度]=[项目宽度]*[各块总占空间比率]
                //[各块矩形宽度]=([各块总占空间比率的实际宽度]-[各块间的间距]*([块数]))/[块数]
                //[一边空余空间宽度]=([项目宽度]-[各块所占空间比率的总宽度])/2  
    
                System.Drawing.Point[] pi = new Point[arrValues.Length]; //定义折线点的对象数组
                System.Drawing.Point[] pit = new Point[3]; //定义坐标三角点的对象数组
                System.Drawing.Pen pe = new Pen(new SolidBrush(GetColor(7)), 1f); //定义画直线的对象
                //画纵轴
                objGps.DrawLine(pe, new Point(ChartLeft, ImgHeight - ChartBottom), new Point(ChartLeft, ChartTop));
                //画纵轴终点箭头
                pit[0].X = ImgWidth - ChartRight; //确定三角形三点的位置
                pit[0].Y = ImgHeight - ChartBottom - 4;
                pit[1].X = ImgWidth - ChartRight;
                pit[1].Y = ImgHeight - ChartBottom + 4;
                pit[2].X = ImgWidth - ChartRight + 10;
                pit[2].Y = ImgHeight - ChartBottom;
                objGps.FillPolygon(new SolidBrush(GetColor(7)), pit);
                //画纵轴标尺和标尺描述
                for (int i = 1; i <= YItemNum; i++)
                {
                    //画标尺
                    objGps.DrawLine(pe,
                                    new PointF(ChartLeft,
                                               ImgHeight - ChartBottom -
                                               (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i),
                                    new PointF(ChartLeft - 5,
                                               ImgHeight - ChartBottom -
                                               (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i));
                    //画描述
                    objGps.DrawString(arrValueNames[i - 1].ToString(), new Font("宋体", 10), Brushes.Black,
                                      new Point(YStrStart,
                                                ImgHeight - ChartBottom -
                                                (ImgHeight - ChartBottom - ChartTop - YTop)/YItemNum*i - 5));
                }
                //画横轴
                objGps.DrawLine(pe, new Point(ChartLeft, ImgHeight - ChartBottom),
                                new Point(ImgWidth - ChartRight, ImgHeight - ChartBottom));
                //画横轴终点箭头
                pit[0].X = ChartLeft - 3; //确定三角形三点的位置
                pit[0].Y = ChartTop;
                pit[1].X = ChartLeft + 3;
                pit[1].Y = ChartTop;
                pit[2].X = ChartLeft;
                pit[2].Y = ChartTop - 10;
                objGps.FillPolygon(new SolidBrush(GetColor(7)), pit);
                //画横轴标尺和标尺描述
    
                arrValueNames = strGIFName;
    
    
                for (int i = 1; i <= ItemNum; i++)
                {
                    //i表示画的 第几个 ImgHeight - ChartBottom + 5 表示线的长度
                    //pe 表示pen 定义的一只笔
                    //  ChartLeft + itemwidth * i, ImgHeight - ChartBottom  横坐标=左边距+显示个数 ImgHeight - ChartBottom纵坐标=图片总高度-底边距离
    
                    objGps.DrawLine(pe, new PointF(ChartLeft + itemwidth*i, ImgHeight - ChartBottom),
                                    new PointF(ChartLeft + itemwidth*i, ImgHeight - ChartBottom + 10)); //画横坐标大刻度
    
                    //画小刻度和标示
                    for (int j = 1; j <= ChildNum; j++)
                    {
                        //
                        float widthX; //定义起点和重点的横坐标
                        widthX = ChartLeft + itemwidth*j/ChildNum + (i - 1)*itemwidth;
                        //画小的刻度
                        objGps.DrawLine(pe, new PointF(widthX, ImgHeight - ChartBottom),
                                        new PointF(widthX, ImgHeight - ChartBottom + 3));
                        //画小标示
    
    
    
                        //arrValueNames[]
                        //  ChartLeft + childspace + itemwidth * (i - 1)  横坐标=左边距+间隔+个数
                        int widthxiao;
                        widthxiao = ChartLeft + xiaoSpacing + itemwidth*(j - 1)/ChildNum + itemwidth*(i - 1);
                        objGps.DrawString(strArrValueName[j - 1].ToString(), new Font("宋体", 9), Brushes.Blue,
                                          new Point(widthxiao, ImgHeight - ChartBottom + XStrStart - 12));
                    }
    
    
    
                    objGps.DrawString(arrValueNames[i - 1].ToString(), new Font("宋体", 12), Brushes.Black,
                                      new Point(ChartLeft + intjiange + itemwidth*(i - 1),
                                                ImgHeight - ChartBottom + XStrStart));
                }
    
    
    
                //框架完成 开始画图
                for (int intfalge = 1; intfalge <= ItemNum; intfalge++)
                {
    
                    for (int j = 0; j < ChildNum; j++) //画矩形图和折线图
                    {
                        int theintwidth = 0;
                        //左边距+各块间距
                        theintwidth = ChartLeft + itemwidth * j / ChildNum + Xxiaospace_between + (intfalge - 1) * itemwidth;
                      
                        if(IsDemonstrationRectangle==true)
                        {
                         //画矩形                   
                         //5表示距离小刻度的位置
                        //j * (childspace + rectanglewidth)) + childspace + ChartLeft   
                        //画矩形里面的颜色
                        objGps.FillRectangle(new SolidBrush(GetColor(j)), theintwidth,
                                             ImgHeight - ChartBottom - arrValues[j],
                                             rectanglewidth, arrValues[j]);
                        //画矩形外框
                        objGps.DrawRectangle(Pens.Black, theintwidth, ImgHeight - ChartBottom - arrValues[j], rectanglewidth,
                                             arrValues[j]);
                        }
                        
                        //********************************画折线图****************************************************
                        if(IsDemonstrationCurve==true)
                        {
                            //   pi[j].X = (j * (childspace + rectanglewidth)) + childspace + ChartLeft;
                            pi[j].X = theintwidth; //定义折线的横坐标
                            pi[j].Y = ImgHeight - ChartBottom - arrValues[j]; //纵坐标=图片总高度-底部高度-实际数值
    
                            pe.SetLineCap(System.Drawing.Drawing2D.LineCap.RoundAnchor,
                                          System.Drawing.Drawing2D.LineCap.RoundAnchor,
                                          System.Drawing.Drawing2D.DashCap.Round);
                            if (j > 0) //进行连线
                            {
                                objGps.DrawLine(pe, pi[j - 1], pi[j]);
                            }
                        }                 
                    }
                }
    
                //objBitMap.Save(Response.OutputStream, ImageFormat.Gif);//该位图对象以"GIF"格式输出
                //objBitMap.Save();//进行保存
                System.Web.HttpServerUtility myServer = System.Web.HttpContext.Current.Server;
                string strPath= myServer.MapPath("~/CurveGIF/");
    
                //string strPath = System.Web.HttpContext.Current.Request.PhysicalApplicationPath.ToString() +
                 //"/CurveGIF/"+FileName+".gif";
    
                objBitMap.Save(strPath+FileName+".gif");
                pe.Dispose();
                objBitMap.Dispose();
                GC.Collect(); //资源释放 垃圾回收
                return true;
            }catch(Exception ex)
            {
                return false;
            }
        }
    
    
    
        /**/
        /// <param name="itemIndex">系统定义的颜色,有效值0到7,分别为(Blue,Yellow,Red,Orange,Purple,Brown,Pink,Black)</param>
        /// <returns></returns>
        public static Color GetColor(int itemIndex)
        {
            Color objColor = new Color();
            switch (itemIndex)
            {
                case 0:
                    objColor = Color.Blue;
                    break;
                case 1:
                    objColor = Color.Yellow;
                    break;
                case 2:
                    objColor = Color.Red;
                    break;
                case 3:
                    objColor = Color.Orange;
                    break;
                case 4:
                    objColor = Color.Purple;
                    break;
                case 5:
                    objColor = Color.Brown;
                    break;
                case 6:
                    objColor = Color.Pink;
                    break;
                case 7:
                    objColor = Color.Peru;
                    break;
                case 8:
                    objColor = Color.PowderBlue;
                    break;
                case 9:
                    objColor = Color.RosyBrown;
                    break;
                case 10:
                    objColor = Color.RoyalBlue;
                    break;
                case 11:
                    objColor = Color.SaddleBrown;
                    break;
                case 12:
                    objColor = Color.SeaGreen;
                    break;
                default:
                    objColor = Color.Black;
                    break;
            }
            return objColor;
        }
    
    
    
        /**/
        /// <param name="red">自定义颜色红色分量值,有效值0到255</param>
        /// <param name="green">自定义颜色绿色分量值,有效值0到255</param>
        /// <param name="blue">自定义颜色蓝色分量值,有效值0到255</param>
        /// <returns></returns>
        public static Color GetColor(int red, int green, int blue)
        {
            Color objColor = new Color();
            objColor = Color.FromArgb(red, green, blue);
            return objColor;
        }
    
    }

    然后这里是 调用的方法:

            Curve myCurve = new Curve();
    
            /**设置参数**/
            myCurve.IsDemonstrationCurve = true;  //是否显示曲折线
            myCurve.IsDemonstrationRectangle = false;//是否显示矩形
            string[] strValue = {"2","3","1","1.5"};//显示的数据  现在只能显示4 个
            myCurve.CurveData = strValue; //赋值
            myCurve.getCurve(Guid.NewGuid().ToString());//创建GIF 保存
            Response.Write("GIF生成成功!");

    不过要注意的是  需要建立文件夹  

    出处:http://blog.csdn.net/jacky4955/article/details/4061658

  • 相关阅读:
    洛谷 P6851 【onu】贪心
    联赛模拟测试12 C. sum 莫队+组合数
    晚间测试4 哪一天她能重回我身边 神奇建图+基环树
    联赛模拟测试11 D. 甜圈 线段树维护哈希值
    CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 树上启发式合并(DSU ON TREE)
    CF788B Weird journey 题解
    联赛模拟测试10 C. 射手座之日
    晚间测试3 B. 单(single)
    CF538B Quasi Binary 思维题
    CF600E Lomsat gelral 树上启发式合并
  • 原文地址:https://www.cnblogs.com/mq0036/p/3719827.html
Copyright © 2011-2022 走看看