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
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](http://blog.itpub.net/images/user_pic_default.png)
请登录后发表评论
登录
全部评论
<%=items[i].createtime%>
<%=items[i].content%>
<%if(items[i].items.items.length) { %>
<%for(var j=0;j
<%}%> <%if(items[i].items.total > 5) { %>
<%}%>
<%=items[i].items.items[j].createtime%>
<%=items[i].items.items[j].username%> 回复 <%=items[i].items.items[j].tousername%>: <%=items[i].items.items[j].content%>
还有<%=items[i].items.total-5%>条评论
) data-count=1 data-flag=true>点击查看
<%}%>
转载于:http://blog.itpub.net/12639172/viewspace-407087/