ASP.NET图形开发带超链接的饼图
饼图文档对象 PieShape
本对象定义了一个完整的饼图,是本程序的核心模块。本对象首先是PieShapeItem的一个强类型列表,它是从System.Collections.CollectionBase上面派生的,通过使用对象的Add或Remove方法就能往这个对象添加或删除饼图项目对象PieShapeItem。当向列表添加项目时未指定项目颜色时会创建一个默认颜色,本类型定义了一个StdColors的静态的颜色数组,新饼图元素的颜色就根据这个颜色数组进行分配。
对象定义了一个RefreshState方法用来计算各个饼图元素对应的扇形区域的起始角度和终止角度。
/// <summary>
/// 刷新对象状态
/// </summary>
/// <remarks>
/// 本函数中反向遍历所有的饼图项目,
/// 计算各个饼图项目的起始和终止角度</remarks>
public void RefreshState()
{
double TotalValue = 0 ;
foreach( PieShapeItem item in this )
{
TotalValue += item.Value ;
}
float AngleCount = 0 ;
for( int iCount = this.Count - 1 ; iCount >= 0 ; iCount -- )
{
PieShapeItem item = this[ iCount ] ;
float angle = ( float ) ( 360.0 * item.Value / TotalValue ) ;
item.StartAngle = ( float ) Math.Round( AngleCount , 3 ) ;
item.EndAngle = ( float ) Math.Round( AngleCount + angle , 3 ) ;
AngleCount += angle ;
item.StartAngle = ( float ) Math.Round( FixAngle( item.StartAngle ) , 3 );
item.EndAngle = ( float ) Math.Round( FixAngle( item.EndAngle ) , 3 ) ;
}
}
/// <summary>
/// 根据椭圆形状修正角度
/// </summary>
/// <param name="angle">原始角度</param>
/// <returns>修正后的角度值</returns>
private float FixAngle( float angle )
{
if( ( angle % 90.0 ) == 0 )
return angle ;
if( intWidth == intHeight )
return angle ;
double x = intWidth * Math.Cos( angle * Math.PI / 180 );
double y = intHeight * Math.Sin( angle * Math.PI / 180 );
float result = ( float ) ( Math.Atan2( y , x ) * 180 / Math.PI );
if( result < 0 )
result += 360 ;
return result ;
}
在这个方法中,我们首先计算所有项目的数值和。然后遍历所有的项目,计算它的扇形区域的起始角度和终止角度。由于要显示的是椭圆形饼图,相对于正圆图形是被压扁的,因此这个起始角度和终止角度需要调用FixAngle函数进行修正。
由于在计算机屏幕上绘制扇形是顺时针方向的,而我们察看一般习惯是顺时针看的,因此这里需要反向遍历饼图项目。
计算各个饼图项目的角度数据后,我们可以绘制图形或者获得图形定位信息。首先我们定义函数CreatePath函数来获得指定饼图项目的路径对象。代码如下。
/// <summary>
/// 为一个饼图项目创建路径对象
/// </summary>
/// <param name="item">饼图项目</param>
/// <returns>创建的路径对象</returns>
public GraphicsPath CreatePath( PieShapeItem item )
{
GraphicsPath path = new GraphicsPath();
path.AddPie(
intLeft ,
intTop ,
intWidth ,
intHeight ,
item.StartAngle ,
item.EndAngle - item.StartAngle );
return path ;
}
这个函数也很简单,创建一个路径对象,然后添加一个扇形区域。
我们定义了一个Draw函数来绘制饼图图形。其代码为
/// <summary>
/// 绘制饼图图形
/// </summary>
/// <param name="g">图形绘制对象</param>
/// <param name="ClipRectangle">剪切矩形</param>
public void Draw( Graphics g , Rectangle ClipRectangle )
{
foreach( PieShapeItem item in this )
{
using( GraphicsPath path = CreatePath( item ))
{
using( SolidBrush b = new SolidBrush( item.Color ))
{
g.FillPath( b , path );
g.DrawPath( Pens.Black , path );
}
}
}
}
这个方法也不复杂,也就是遍历所有的饼图项目,为每一个项目创建路径对象,然后使用饼图项目的颜色填充路径,并使用黑线绘制路径的边框。
由于本程序是ASP.NET程序,需要在服务器端生成图片文档,因此本对象也提供了CreateBitmap函数来生成包含图形的位图对象。其代码为
/// <summary>
/// 创建一个包含对象图形位图对象
/// </summary>
/// <returns>创建的位图对象</returns>
public Bitmap CreateBitmap( )
{
Bitmap bmp = new Bitmap( intWidth + 1 , intHeight + 1 ) ;
using( Graphics g = Graphics.FromImage( bmp ))
{
g.Clear( Color.White );
g.TranslateTransform( intLeft , intTop );
g.SmoothingMode = SmoothingMode.HighQuality ;
Draw( g , this.Bounds );
}
return bmp ;
}
这个函数里面首先根据对象大小生成一个位图对象,然后在这个位图对象上创建一个图形绘制对象,填充白色背景,并进行一下坐标转换,然后调用Draw函数绘制对象图形。然后函数就返回创建的位图对象了。
文章评论
共有 0位网翼网友发表了评论 查看完整内容