ASP.NET图形化的曲线图类(1)


chart.cs
using System;
using System.Drawing;
namespace Report
{
  /// <summary>
  /// Chart 的摘要说明。
  /// ==================================================================================================
  ///
  ///  ClassName :Report.Chart 
  ///  Intro   :
  ///  Example  : 
  ///  Ver    :0.2
  ///  
  ///  Author   :ttyp 
  ///  Email   :ttyp@21cn.com 
  ///  Date    :2007-7-30
  /// ==================================================================================================
  /// </summary>
  public class Chart
  {
    public Chart(){}
    private string  _data  = "";
    private int    _width  = 100;
    private int    _height  = 100;
    private int    _padding= 8;
    private Color  _grid_color    = Color.FromArgb(0x93,0xbe,0xe2);
    private Color  _border_color  = Color.FromArgb(0x93,0xbe,0xe2);
    private Font  _font      = new Font("Arial",8);
    public Font Font
    {
      get { return _font;}
      set { _font = value;}
    }
    public Color BorderColor
    {
      get { return _border_color;}
      set { _border_color = value;}
    }
    public Color GridColor
    {
      get { return _grid_color;}
      set { _grid_color = value;}
    }
    public int Padding
    {
      get { return _padding;}
      set { _padding = Math.Max(0,value);}
    }
    public int Width
    {
      get { return _width;}
      set { _width = Math.Max(0,value);}
    }
    public int Height
    {
      get { return _height;}
      set { _height = Math.Max(0,value);}
    }
    public string Data
    {
      get { return _data;}
      set { _data = value;}
    }
    public void Render()
    {
      int width    = this.Width;
      int height    = this.Height;
      int padding    = this.Padding;  
      System.Drawing.Bitmap image = new System.Drawing.Bitmap(width,height);  
      Graphics g = Graphics.FromImage(image);
      //清空图片背景色
      g.Clear(Color.White);
      //虚线画笔
      Pen dot        = new Pen(this.GridColor);
      dot.DashStyle  = System.Drawing.Drawing2D.DashStyle.Dot;
      //实线画笔
      Pen solid      = new Pen(this.BorderColor);
      //文字字体
      Font font      = this.Font;    
      try
      {        
        //冗余,去除最后的数据分割标记,防止空数据
        if(this.Data.EndsWith(";"))
        {
          this.Data = this.Data.Substring(0,this.Data.Length-1);
        }
        string[] info = this.Data.Split(';');    //数据信息
        if(info.Length>=2)
        {
          string[] lines = info[0].Split(',');  //图例
          string[] units = info[1].Split(',');  //单位和标题格式,a,b,c,d a 纵坐标单位 b 纵坐标格式 N 数字 D 时间 后面是具体格式,c 横坐标单位 d 横坐标格式(同b)
          //曲线颜色表
          Color[] color  = new Color[]{Color.Blue,Color.Green,Color.Red,Color.Gray,Color.Black,Color.Magenta,Color.Cyan,Color.Yellow,Color.DeepPink,Color.BurlyWood,Color.DarkRed,Color.Gold};
          //图例文字的大小
          SizeF sFont      = GetMaxSize(lines,g,font);
          //获得刻度文字高度
          int textHeight    = (int)(sFont.Height*3/2);
          //曲线点的个数
          int points      = info.Length-2;
          //得到曲线点数组集合
          string[,] curve = new string[info.Length-2,lines.Length+1];
          for(int i=0;i<points;i++)
          {
            string[] l = info[i+2].Split(',');
            int len = l.Length;
            for(int j=0;j<=lines.Length;j++)
            {
              if(j<len)
              {            
                curve[i,j] = l[j];
              }
              else
              {
                curve[i,j] = "N";      //非数据,不画线
              }
            }        
          }    
          //获得最大,最小值
          double maxY,minY,maxX,minX;
          GetMaxMin(curve,out maxY,out minY,out maxX,out minX);
          //冗余最大最小值
          if(maxY==minY)
          {
            if(maxY==0)
            {
              maxY = 10;
              minY = -10;
            }
            else
            {
              if(maxY>0)
              {
                maxY = maxY*2;
                minY = 0;
              }
              else
              {
                maxY = 0;
                minY = maxY*2;
              }
            }
          }
          if(maxX==minX)
          {
            if(maxX==0)
            {
              maxX = 10;
              minX = -10;
            }
            else
            {
              if(maxX>0)
              {
                maxX = maxX*2;
                minY = 0;
              }
              else
              {
                maxX = 0;
                minX = maxX*2;
              }
            }
          }
          //获取坐标框的上下左右
          float left    = (padding*2+sFont.Height+2 + sFont.Width + padding+GetMaxSize(units[1],g,font).Width+padding);
          float bottom  = height-padding-textHeight;
          float top    = padding;
          float right    = width -padding;
          //获取曲线框的宽度和高度(比坐标框略小)
          float yWidth = bottom-top-GetMaxSize(units[0],g,font).Height*3/2-padding;
          float xWidth = right-left-GetMaxSize(units[3],g,font).Width/2 - sFont.Width -padding;
          //---------------------------------------------------------------------------------
          //获取最大行
          int maxrow  = (int)(yWidth/(sFont.Height/2*3));
          maxrow  = Math.Max(maxrow,1);
          //获取Y步进值
          float stepYv = (float)((maxY-minY)/(maxrow));
          if(units[1].Length>1)
          {
            //整数分割,调整最大行和最大最小值
            if(units[1].Substring(0,1).ToLower()=="d")
            {
              maxY  = Math.Ceiling(maxY);
              minY  = Math.Floor(minY);
              stepYv  = (float)Math.Ceiling((maxY-minY)/maxrow);
              maxrow  = (int)((maxY-minY)/stepYv);              
            }  
          }
          float stepy    = (float)((yWidth/(maxY-minY))*stepYv);
http://www.cnblogs.com/ttyp/archive/2007/07/20/825423.html
« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3