【ttyp】ASP.NET图形化的曲线图类

chart.cs

using  System;
using  System.Drawing;

namespace  Report
{
    
///  
    
///  Chart 的摘要说明。
    
///  ==================================================================================================
    
///  
    
///     ClassName  :Report.Chart  
    
///     Intro      :
    
///     Example    :  
    
///     Ver        :0.2
    
///      
    
///     Author     :ttyp  
    
///     Email      :ttyp@21cn.com  
    
///     Date       :2007-7-30
    
///  ==================================================================================================
    
///  
     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);

                
                    
// ---------------------------------------------------------------------------------


                    
// 得到最大的网格列(最多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;   &nbs

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-407087/,如需转载,请注明出处,否则将追究法律责任。

user_pic_default.png
请登录后发表评论 登录
全部评论
<%=items[i].createtime%>

<%=items[i].content%>

<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%=items[i].items.items[j].createtime%> 回复

<%=items[i].items.items[j].username%>   回复   <%=items[i].items.items[j].tousername%><%=items[i].items.items[j].content%>

<%}%> <%if(items[i].items.total > 5) { %>
还有<%=items[i].items.total-5%>条评论 ) data-count=1 data-flag=true>点击查看
<%}%>
<%}%>
<%}%>

转载于:http://blog.itpub.net/12639172/viewspace-407087/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值