ASP.NET图形开发带超链接的饼图

时间:2008-07-04 06:03:16  来源:  作者:  【背景色 杏仁黄 秋叶褐 胭脂红 芥末绿 天蓝 雪青 灰 银河白

  饼图文档对象 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位网翼网友发表了评论 查看完整内容