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, 10, 204, 190, 204);
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, 200, 100, startAngle, sweepAngle);
92 }
93 }
94 gp.FillPie(sb, pointX, pointY, 200, 100, startAngle, sweepAngle);
95 startAngle += sweepAngle;
96 if (single)
97 {
98 gp.FillRectangle(sb, new Rectangle(10, y, 20, 15));
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, 20, 15));
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, 10, 258, 190, 258);
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}
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, 10, 204, 190, 204);
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, 200, 100, startAngle, sweepAngle);
92 }
93 }
94 gp.FillPie(sb, pointX, pointY, 200, 100, startAngle, sweepAngle);
95 startAngle += sweepAngle;
96 if (single)
97 {
98 gp.FillRectangle(sb, new Rectangle(10, y, 20, 15));
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, 20, 15));
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, 10, 258, 190, 258);
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}