C#画3D饼图(二)
在C#画饼图一中介绍了小王利用C#画了一个平面饼状图,在小王画出来之后,小王开始想入非非了--要是能画出3D的饼状图该多好,于是小王就开始修改showImage.ashx页面了,果然功夫不负有心人,居然给小王做出来了,先看结果:

Yeh!看起来的确比原来帅多了,其实很简单,就是将原来的饼状图画成为椭圆,并在Y轴方向上向下多画了几个饼图,并将其重合在一起而已(这就是3D啦)!
修改后的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
{
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
//gp.FillPie(sb, rect, startAngle, sweepAngle);
76
if (startAngle < 180)
77
{
78
for (int height = 0; height < 8; height++)
79
{
80
gp.FillPie(Brushes.Black, pointX, pointY + height, 200, 100, startAngle, sweepAngle);
81
}
82
}
83
gp.FillPie(sb, pointX, pointY, 200, 100, startAngle, sweepAngle);
84
startAngle += sweepAngle;
85
if (single)
86
{
87
gp.FillRectangle(sb, new Rectangle(10, y, 20, 15));
88
gp.DrawString(dp.name, new Font("Tahoma", 8, FontStyle.Regular), Brushes.Black, new PointF(30, y));
89
single = false;
90
}
91
else
92
{
93
gp.FillRectangle(sb, new Rectangle(110, y, 20, 15));
94
gp.DrawString(dp.name, new Font("Tahoma", 8, FontStyle.Regular), Brushes.Black, new PointF(130, y));
95
single = true;
96
y += 20;
97
}
98
}
99
//save the image in the page
100
gp.DrawLine(Pens.Black, 10, 258, 190, 258);
101
context.Response.ContentType = "Image/GIF";
102
context.Response.Clear();
103
context.Response.BufferOutput = true;
104
bm.Save(context.Response.OutputStream, ImageFormat.Gif);
105
}
106
}
107
}
108
}
109
110
public bool IsReusable
111
{
112
get
113
{
114
return false;
115
}
116
}
117
118
}
<%@ 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 : IHttpHandler14
{15
struct department16
{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 database33
try34
{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
finally52
{53
conn.Close();54
}55
//Draw the pie of the every department56
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
//gp.FillPie(sb, rect, startAngle, sweepAngle);76
if (startAngle < 180)77
{78
for (int height = 0; height < 8; height++)79
{80
gp.FillPie(Brushes.Black, pointX, pointY + height, 200, 100, startAngle, sweepAngle);81
}82
}83
gp.FillPie(sb, pointX, pointY, 200, 100, startAngle, sweepAngle);84
startAngle += sweepAngle;85
if (single)86
{87
gp.FillRectangle(sb, new Rectangle(10, y, 20, 15));88
gp.DrawString(dp.name, new Font("Tahoma", 8, FontStyle.Regular), Brushes.Black, new PointF(30, y));89
single = false;90
}91
else92
{93
gp.FillRectangle(sb, new Rectangle(110, y, 20, 15));94
gp.DrawString(dp.name, new Font("Tahoma", 8, FontStyle.Regular), Brushes.Black, new PointF(130, y));95
single = true;96
y += 20;97
}98
}99
//save the image in the page100
gp.DrawLine(Pens.Black, 10, 258, 190, 258);101
context.Response.ContentType = "Image/GIF";102
context.Response.Clear();103
context.Response.BufferOutput = true;104
bm.Save(context.Response.OutputStream, ImageFormat.Gif);105
}106
}107
}108
}109
110
public bool IsReusable111
{112
get113
{114
return false;115
}116
}117

118
}


浙公网安备 33010602011771号