Welcome

首页 / 软件开发 / .NET编程技术 / .NET3.5 GDI+图形操作6(完)

.NET3.5 GDI+图形操作6(完)2011-04-15 博客园 牛腩10.4 应用实例

10.4.1 饼图

统计图是信息管理系统常用的功能,常用的有饼图、柱形图、拆线图等。饼图用来表示各 部分比例,柱形图用来表示各部分的比较,拆线图用来表示发展趋势,另外还有其他一些具 有特殊功能的图示。本小节将以二维饼图为例说明通过.NET GDI+来绘制统计图的原理。

本例实现效果很简单,即根据给予的一组数据计算出各个数据项的比例,并分别用不同颜 色表示,组成一个圆饼,如下图所示:

用户可以使用FillPie来绘制饼块,多个饼块拼接在一起就形成了圆饼效果。其基本算法 就是每个部分角度的计算,在总共360°的条件下,每个部分会占多少度。为了方便起见,本 例的数据源采用数组,在实例应用过程中,数组数据可以来自数据库,具体代码如下:

int[] arr = {100,35,115,125,75,120 };
// 原书中没有这句,表示不同的颜色
Color[] colors = { Color.BlueViolet,Color.Yellow,Color.Green,Color.Gray,Color.Blue,Color.Purple};
Bitmap bmp = new Bitmap(400,400); // 创建一个图像
Graphics g = Graphics.FromImage(bmp); // 创建Graphics 对象
g.Clear(Color.White); // 白色背景
g.DrawString("本书上半年销售情况", new Font("黑体",16), Brushes.Black, new PointF(5,5)); // 标题

float length = 200;
float currentAngle = 0; // 当前饼块的角度
float totalAngle = 0; // 已画完的饼块的角度和
float totalValues = 0; // 所有值总和
// 所有值求和
foreach (int i in arr)
{
totalValues += i;
}
// 开始画饼块
for (int i = 0; i < arr.Length;i++ )
{
currentAngle = arr[i] / totalValues * 360; // 计算当前饼块角度
g.FillPie(new SolidBrush(colors[i]), 100, 50, length, length, totalAngle, currentAngle); // 填充饼块
// 画饼块边界
g.DrawPie(Pens.Black, 100, 50, length, length, totalAngle, currentAngle);
totalAngle += currentAngle;
}
// 原书示例代码中没有,没有这句则在非IE浏览器会出错
Response.ContentType = "image/GIF";
// 将图形加载到Response中
bmp.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
g.Dispose();

上面代码粘贴到Page_Load中,运行页面就可以看到效果中的样子。如果想在饼块的各个 部分添加说明文字,可以使用DrawString绘制文字,或者在图的空白处显示图例说明,图例 可以使用FillRectangle绘制矩形区域。