用ASP.NET with C#绘制饼图(Pie图)

公司昨天停水,停一天了,到现在还没有。连冲凉的水也没有了,郁闷~~

今天我们来绘制个饼图,也叫Pie图。照例,有图先上图:

Pie1.jpg

昨天好心忘了说明一件小事,Bar图和Pie图的颜色都是由自定义的颜色数组定义的,分配颜色函数如下:

 

None.gif              private  Color GetColor( int  i)  // 分配各Pie的颜色
ExpandedBlockStart.gifContractedBlock.gif
             dot.gif {
InBlock.gif                
try
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if0 < i && i < PieColor.Length )
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
return PieColor[i];
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
else if( i >= PieColor.Length )
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
int j = i % PieColor.Length;
InBlock.gif                        
return PieColor[j];
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        
return Color.Green;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif                
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
return Color.Green;
ExpandedSubBlockEnd.gif                }

ExpandedBlockEnd.gif            }


如果颜色不够,则循环取用颜色数组的数值,在我们绘制的Bar图和Pie图中,颜色数值有10个颜色,而Values数值有12个,所以会重复出现Color.Green和Color.Red两种颜色,颜色数组是可以自定义的,只要设置好足够长的颜色值,就不会出现同颜色的情况了。

和绘制Curve图和Bar图一样,绘制Pie图也需要先初始化页面,而初始化Pie图的页面基本和初始化Bart图一样,这里就不再详细说明,直接贴代码吧:

 

None.gif              // 初始化和填充图像区域,画出边框,初始标题
None.gif
             private   void  InitializeGraph()
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif            
InBlock.gif                
//根据给定的高度和宽度创建一个位图图像
InBlock.gif
                objBitmap = new Bitmap(Width,Height);
InBlock.gif
InBlock.gif                
//从指定的 objBitmap 对象创建 objGraphics 对象 (即在objBitmap对象中画图)
InBlock.gif
                objGraphics = Graphics.FromImage(objBitmap);
InBlock.gif
InBlock.gif                
//根据给定颜色(LightGray)填充图像的矩形区域 (背景)
InBlock.gif
                objGraphics.DrawRectangle(new Pen(BorderColor,1),0,0,Width,Height);
InBlock.gif                objGraphics.FillRectangle(
new SolidBrush(BgColor),1,1,Width-2,Height-2);
InBlock.gif
InBlock.gif                
//初始化标题
InBlock.gif
                CreateTitle(ref objGraphics);
ExpandedBlockEnd.gif            }

None.gif
None.gif            
// 初始化右边说明部分
None.gif
             private   void  DrawRight( ref  Graphics objGraphics)
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                objGraphics.DrawString(String.Format(
"单位:{0}",Unit),new Font("宋体",10),new SolidBrush(TextColor),Width-95,30);
InBlock.gif
InBlock.gif                Point KeysPoint 
= new Point(Width-120,50);
InBlock.gif                Point KeysTextPoint 
= new Point(Width-90,50);
InBlock.gif                
for(int i=0;i < Keys.Length;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    objGraphics.DrawRectangle(
new Pen(BorderColor,1),KeysPoint.X,KeysPoint.Y,21,11);
InBlock.gif                    objGraphics.FillRectangle(
new SolidBrush(GetColor(i)),KeysPoint.X,KeysPoint.Y,20,10);
InBlock.gif                    objGraphics.DrawString(String.Format(
"{0} {1}",Keys[i],Values[i]),new Font("宋体",10),new SolidBrush(TextColor),KeysTextPoint);
InBlock.gif                    KeysPoint.Y 
+=15;
InBlock.gif                    KeysTextPoint.Y 
+= 15;
ExpandedSubBlockEnd.gif                }

ExpandedBlockEnd.gif            }

 

None.gif              // 初始化标题
None.gif
             private   void  CreateTitle( ref  Graphics objGraphics)
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                objGraphics.DrawString(Title,
new Font("宋体",16),new SolidBrush(TextColor),new Point(5,5));
ExpandedBlockEnd.gif            }


或Pie图主要是用.NET.Framework提供的DrawPie函数,该函数可以绘制一个扇形,而整个Pie图就是由N个扇形组合成的一个圆。主要的指导思想是将所有Values值起来,然后将每个Values值和总Values值相除,再乘以360,就可以得出各个Values值对应的扇形的角度了。具体代码:

 

None.gif              private   void  DrawContent( ref  Graphics objGraphics)
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                
float Sum = 0;
InBlock.gif                
float StartAngle = 0;
InBlock.gif                
float SweepAngle = 0;
InBlock.gif                
float CircleHeight = 0;
InBlock.gif                
float CircleX = 0;
InBlock.gif                
float CircleY = 0;
InBlock.gif
InBlock.gif                
for(int i=0;i<Values.Length;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    Sum 
+= Values[i];
ExpandedSubBlockEnd.gif                }

InBlock.gif                
if(Width > Height)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    CircleHeight 
= Height - 100;
ExpandedSubBlockEnd.gif                }

InBlock.gif                
else
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    CircleHeight 
= Width - 150;
ExpandedSubBlockEnd.gif                }

InBlock.gif                CircleX 
= (Width - 150)/2 - CircleHeight/2;
InBlock.gif                CircleY 
= Height - 50 - CircleHeight;
InBlock.gif                
for(int i=0;i<Values.Length;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    SweepAngle 
= (Values[i]/Sum)*360;
InBlock.gif                    objGraphics.DrawPie (
new Pen(BorderColor,1),CircleX,CircleY,CircleHeight,CircleHeight,StartAngle,SweepAngle);
InBlock.gif                    objGraphics.FillPie (
new SolidBrush(GetColor(i)),CircleX,CircleY,CircleHeight,CircleHeight,StartAngle,SweepAngle);
InBlock.gif                    StartAngle 
+= SweepAngle;
ExpandedSubBlockEnd.gif                }

ExpandedBlockEnd.gif            }


至此,Pie图算是完成了,也具有一定的缩放能力,来看看最终效果吧:

Pie2.jpg

到今天,Curve图,Bar图和Pie图我们绘制了一遍,相信经过三个例子的学习,对应绘图这个功能已经了解有点儿入门了,要绘制其他的图片,只要用好了DrawRectangle,DrawString,DrawPie等相关函数(更具体的说明看MSDN吧),绘制也不是什么难事了。我们的目标是举一反三嘛。绘图说完了,明天会上一篇关于文件上传的文章。

照例,有批评建议请留言或直接Email给我:KenBlove#gmail.com(将#换成@)

很多朋友要求提供完整源文件,现在放上完整代码例子,希望能帮到大家。最近工作忙死了,博客也暂时不能更新了。
点击下载:pie.rar

转载于:https://www.cnblogs.com/KenBlove/archive/2006/07/29/462576.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值