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

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

先看结果:

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

看代码(showImage.ashx):

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

 20    
 21    public void ProcessRequest (HttpContext context)
 22    {
 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
 34        {
 35            conn.Open();
 36            SqlCommand comm = new SqlCommand("select * from department", conn);
 37            SqlDataReader dr = comm.ExecuteReader();
 38            while (dr.Read())
 39            {
 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)
 48        {
 49            throw new Exception(ex.Message);
 50        }

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

 55        //Draw the pie of the every department
 56        if (departments.Count > 0)
 57        {
 58            using (Bitmap bm = new Bitmap(200,260))
 59            {
 60                using (Graphics gp = Graphics.FromImage(bm))
 61                {
 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++)
 71                    {
 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)
 77                        {
 78                            pointX += 13;
 79                            pointY += 20;
 80                        }

 81                        else
 82                        {
 83                            pointY = 20;
 84                            pointX = 0;
 85                        }

 86                        //gp.FillPie(sb, rect, startAngle, sweepAngle);
 87                        if (startAngle < 180)
 88                        {
 89                            for (int height = 0; height < 8; height++)
 90                            {
 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)
 97                        {
 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
103                        {
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
122    {
123        get
124        {
125            return false;
126        }

127    }

128
129}
原文地址:https://www.cnblogs.com/cdutedu/p/1289934.html