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


//---------------------------------------------------------------------------------
          //得到最大的网格列(最多10列)
          int maxcol  = points;
          maxcol    = Math.Min(points,maxcol);
          maxcol    = Math.Max(maxcol,1);
          //获取X步进值
          float stepXv = (float)((maxX-minX)/(maxcol));
          if(units[3].Length>1)
          {
            //整数分割,调整最大和最小值,以及步进
            if(units[3].Substring(0,1).ToLower()=="d")
            {
              maxX  = Math.Ceiling(maxX);
              minX  = Math.Floor(minX);
              stepXv  = (float)Math.Ceiling((maxX-minX)/maxcol);
              maxcol  = (int)((maxX-minX)/stepXv);
            }        
          }
          //获得最大显示列数
          int dispcol = (int)((xWidth)/(GetMaxSize(units[3].Substring(1),g,font).Width+padding));
          dispcol = Math.Max(dispcol,1);
          //如果最大显示列小于最大列,则应该缩减
          if(dispcol<maxcol)
          {
            stepXv  = (float)Math.Ceiling((maxX-minX)/dispcol);
            maxcol  = (int)((maxX-minX)/stepXv);
          }
          float stepx = (float)((xWidth/(maxX-minX))*stepXv);
          //获得最大的曲线数目
          int maxline  = color.Length;      
          maxline    = Math.Min(maxline,lines.Length);
          //画图例边框
          g.DrawRectangle(solid, padding, (height-((sFont.Height+5)*maxline+2*padding))/2,padding*2+sFont.Height+2 + sFont.Width, (sFont.Height+5)*maxline+2*padding);
          //画图例
          for(int i=0;i<maxline;i++)
          {
            SolidBrush fb = new SolidBrush(color[i]);
            SolidBrush bl = new SolidBrush(Color.Black);
            //画图例方框
            g.FillRectangle(fb,padding*2, (height-((sFont.Height+5)*maxline+2*padding))/2+(sFont.Height+5)*i+padding,sFont.Height, sFont.Height);
            //画图例文字
            g.DrawString(lines[i], font, bl, padding*2+sFont.Height+2,(height-((sFont.Height+5)*maxline+2*padding))/2+(sFont.Height+5)*i+padding);
          }        
          //画坐标
          g.DrawLine(solid,left,top,left,bottom);    //Y
          g.DrawLine(solid,left,bottom,right,bottom);  //X
          //画坐标箭头
          g.DrawLine(solid,left,top,left-padding/3,top+padding/2);      //Y箭头
          g.DrawLine(solid,left,top,left+padding/3,top+padding/2);
          g.DrawLine(solid,right,bottom,right-padding/2,bottom-padding/3);  //X箭头
          g.DrawLine(solid,right,bottom,right-padding/2,bottom+padding/3);
          //画X刻度
          for(int i=0;i<=maxcol;i++)
          {
            SolidBrush bl = new SolidBrush(Color.Black);
            if(i>0)
            {
              g.DrawLine(dot,left+i*stepx,top+padding,left+i*stepx,bottom);  
            }
            string text = "";
            switch(units[3].Substring(0,1).ToString())
            {
              case "N":
                text = (minX+stepXv*i).ToString(units[3].Substring(1));
                break;
              case "D":
                text = DateTime.FromOADate((int)(minX+stepXv*i)).ToString(units[3].Substring(1));                
                break;
            }    
            SizeF xf = GetMaxSize(text,g,font);
            g.DrawString(text, font, bl, left+i*stepx-xf.Width/2,bottom+xf.Height/2);        
            if(i==0)
            {
              g.DrawString(units[2], font, bl, right-GetMaxSize(units[2],g,font).Width,bottom);          
            }
            if(points<=1)
            {
              break;
            }
          }
          //画Y刻度
          for(int i=0;i<=maxrow;i++)
          {
            SolidBrush bl = new SolidBrush(Color.Black);
            if(i>0)
            {
              g.DrawLine(dot,left,bottom-i*stepy,right-padding,bottom-i*stepy);  
            }
            string text = "";
            switch(units[1].Substring(0,1).ToString())
            {
              case "N":
                text = (minY+i*stepYv).ToString(units[1].Substring(1));
                break;
              case "D":
                text = DateTime.FromOADate(int.Parse(curve[i,0])).ToString(units[1].Substring(1));                
                break;
            }    
            SizeF xf = GetMaxSize(text,g,font);
            g.DrawString(text, font, bl, left-xf.Width,bottom-stepy*i-xf.Height/2);        
            if(i==0)
            {
              g.DrawString(units[0], font, bl, left-GetMaxSize(units[0],g,font).Width-3,top);          
            }
          }
          //画图片的边框线
          g.DrawRectangle(solid, 0, 0, image.Width - 1, image.Height - 1);
          float[] px = new float[maxline];
          float[] py = new float[maxline];
          bool[]  ps = new bool[maxline];
          //画曲线
          for(int j=0;j<points;j++)
          {
            float v = float.Parse(curve[j,0]);
            float cx = (float)(left+(xWidth)*(v-minX)/(maxX-minX));
            for(int i=0;i<maxline;i++)
            {      
              try
              {
                float w = float.Parse(curve[j,i+1]);
                float cy = (float)(bottom - (yWidth)*(w-minY)/(maxY-minY));
                if(ps[i])
                {
                  Pen cp = new Pen(color[i]);
                  g.DrawLine(cp,px[i],py[i],cx,cy);
                }
                px[i] = cx;
                py[i] = cy;
                ps[i] = true;
                if(points==1)
                {
                  image.SetPixel((int)cx,(int)cy,color[i]);
                }
              }
              catch
              {
                ps[i] = false;
              }
            }
          }
        }
        else
        {
          string msg = "no data";
          g.DrawString(msg,font,new SolidBrush(Color.Black), (width - GetMaxSize(msg,g,font).Width)/2,(height-GetMaxSize(msg,g,font).Height)/2);
        }
        System.Web.HttpContext.Current.Response.ClearContent();
        System.Web.HttpContext.Current.Response.ContentType="image/Gif";
        image.Save(System.Web.HttpContext.Current.Response.OutputStream,System.Drawing.Imaging.ImageFormat.Gif);
      }
      finally
      {
        g.Dispose();
        image.Dispose();
      }
    }
    private SizeF GetMaxSize(string[] s,Graphics g,Font f)
    {
      string max = "";
      for(int i=0;i<s.Length;i++)
      {
        if(s[i].Length>max.Length)
        {
          max = s[i];
        }
      }
      return g.MeasureString(max,f);
    }
    private SizeF GetMaxSize(string s,Graphics g,Font f)
    {
      return g.MeasureString(s,f);
    }
    private void GetMaxMin(string[,] data,out double maxY,out double minY,out double maxX,out double minX)
    {
      int row = 0;
      int col = 0;
      double m =double.MinValue,n=double.MaxValue;
      double p =double.MinValue,q=double.MaxValue;
      row = data.GetLength(0);
      col = data.GetLength(1);
      for(int i=0;i<row;i++)
      {
        for(int j=0;j<col;j++)
        {
          double v = 0;
          try
          {
            v = double.Parse(data[i,j]);
            if(j>0)
            {
              if(v>m)
              {
                m = v;
              }
              if(v<n)
              {
                n = v;
              }
            }
            else
            {
              if(v>p)
              {
                p = v;
              }
              if(v<q)
              {
                q = v;
              }
            }
          }
          catch{}
        }
      }
      maxY = m;
      minY = n;
      maxX = p;
      minX = q;
    }
  }
}
使用方法

demo.cs
    private void Page_Load(object sender, System.EventArgs e)
    {
      string data = "Total,T1,T2,T3,T4;(kwh),N0.0,(day),Dyyyy-MM-dd;";
      int days = 50;
      DateTime start = DateTime.Now.AddDays(-1*days);
      System.Random random = new Random();
      System.Text.StringBuilder sb = new System.Text.StringBuilder();
      sb.Append(data);
      string[] b = new string[days];
      for(int i=0;i<days;i++)
      {
        string[] a = new string[6];
        a[0] = ((int)DateTime.Now.AddDays(-1*i).ToOADate()).ToString();
        for(int j=1;j<6;j++)
        {
          System.Threading.Thread.Sleep(1);
          a[j] = random.Next(100).ToString();
        }
        b[i] =string.Join(",",a);
      }
      sb.Append(string.Join(";",b));
      data = sb.ToString();
      Report.Chart chart = new Report.Chart();
      chart.Data    = data;
      chart.Width    = 800;
      chart.Height  = 200;
      chart.Padding  = 8;
      chart.Font = new System.Drawing.Font("楷体2312",8);
      chart.Render();
    }


  demo


« 
» 
快速导航

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