C#画3D饼图并提取其中重要部分(三)

真是无聊得要死,在前面C#画3D饼图(二)文章中说到了3D饼图的画法,今天将其变型----把用户认为是重要的部分从原图中提取出来,方法简单,当在画各个部分的扇形图时,遇到用户需要的部分,将起画图坐标做相应的移动即可。

先看结果:

OK,从上图看出,当我们在画IT部门的扇形图时,我们将坐标X增加了13个单位,Y增加了20个单位(代码行76-85)。

看代码(showImage.ashx):

  1 <% @ WebHandler Language = " C# "  Class = " showImage "   %>
  2
  3 using  System;
  4 using  System.Web;
  5 using  System.Drawing;
  6 using  System.Collections;
  7 using  System.Drawing.Imaging;
  8 using  System.Drawing.Drawing2D;
  9 using  System.Data;
 10 using  System.Data.SqlClient;
 11 using  System.Web.Configuration;
 12
 13 public   class  showImage : IHttpHandler
 14 ExpandedBlockStart.gifContractedBlock.gif {
 15    struct department
 16ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 17        public string name;
 18        public int number;
 19    }

 20    
 21    public void ProcessRequest (HttpContext context)
 22ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 23        ArrayList departments = new ArrayList();
 24        department dp;
 25        int sum=0;
 26        SolidBrush sb = new SolidBrush(Color.Aqua);
 27        Random rd = new Random();
 28        string connstr = "server=(local);database=test;uid=sa;pwd=sa13";
 29        SqlConnection conn = new SqlConnection(connstr);
 30        int startAngle = 0;
 31        int sweepAngle = 45;
 32        //connect the database
 33        try
 34ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 35            conn.Open();
 36            SqlCommand comm = new SqlCommand("select * from department", conn);
 37            SqlDataReader dr = comm.ExecuteReader();
 38            while (dr.Read())
 39ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 40                dp.name = dr["departmentName"].ToString();
 41                dp.number = Convert.ToInt32(dr["departmentNum"]);
 42                sum += dp.number;
 43                departments.Add(dp);
 44            }

 45            dr.Close();
 46        }

 47        catch (Exception ex)
 48ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 49            throw new Exception(ex.Message);
 50        }

 51        finally
 52ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 53            conn.Close();
 54        }

 55        //Draw the pie of the every department
 56        if (departments.Count > 0)
 57ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 58            using (Bitmap bm = new Bitmap(200,260))
 59ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 60                using (Graphics gp = Graphics.FromImage(bm))
 61ExpandedSubBlockStart.gifContractedSubBlock.gif                {
 62                    gp.SmoothingMode = SmoothingMode.AntiAlias;
 63                    gp.Clear(Color.White);
 64                    //Rectangle rect = new Rectangle(0, 0, 200, 200);
 65                    int pointX = 0;
 66                    int pointY = 20;
 67                    gp.DrawLine(Pens.Black, 10204190204);
 68                    bool single = true;
 69                    int y = 210;
 70                    for (int i = 0; i < departments.Count; i++)
 71ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
 72                        dp = (department)departments[i];
 73                        sb.Color = Color.FromArgb(rd.Next(255), rd.Next(255), rd.Next(255));
 74                        sweepAngle = Convert.ToInt32(360 * Convert.ToSingle(dp.number) / Convert.ToSingle(sum));
 75                        //get the special pie
 76                        if (i == 1)
 77ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 78                            pointX += 13;
 79                            pointY += 20;
 80                        }

 81                        else
 82ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 83                            pointY = 20;
 84                            pointX = 0;
 85                        }

 86                        //gp.FillPie(sb, rect, startAngle, sweepAngle);
 87                        if (startAngle < 180)
 88ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 89                            for (int height = 0; height < 8; height++)
 90ExpandedSubBlockStart.gifContractedSubBlock.gif                            {
 91                                gp.FillPie(Brushes.Black, pointX, pointY + height, 200100, startAngle, sweepAngle);
 92                            }

 93                        }

 94                        gp.FillPie(sb, pointX, pointY, 200100, startAngle, sweepAngle);
 95                        startAngle += sweepAngle;
 96                        if (single)
 97ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
 98                            gp.FillRectangle(sb, new Rectangle(10, y, 2015));
 99                            gp.DrawString(dp.name, new Font("Tahoma"8, FontStyle.Regular), Brushes.Black, new PointF(30, y));
100                            single = false;
101                        }

102                        else
103ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
104                            gp.FillRectangle(sb, new Rectangle(110, y, 2015));
105                            gp.DrawString(dp.name, new Font("Tahoma"8, FontStyle.Regular), Brushes.Black, new PointF(130, y));
106                            single = true;
107                            y += 20;
108                        }

109                    }

110                    //save the image in the page
111                    gp.DrawLine(Pens.Black, 10258190258);
112                    context.Response.ContentType = "Image/GIF";
113                    context.Response.Clear();
114                    context.Response.BufferOutput = true;
115                    bm.Save(context.Response.OutputStream, ImageFormat.Gif);
116                }

117            }

118        }

119    }

120 
121    public bool IsReusable
122ExpandedSubBlockStart.gifContractedSubBlock.gif    {
123        get
124ExpandedSubBlockStart.gifContractedSubBlock.gif        {
125            return false;
126        }

127    }

128
129}

转载于:https://www.cnblogs.com/cdutedu/archive/2008/09/12/1289934.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值