今天在CSDN上看到一位网友在询问如何绘制扇形的问题,于是想到自己一年前做过的一个图形报表,里面也有绘制扇形的问题。遂将部分代码,帖上来与大家共享交流
这里所使用的绘制扇形的方法,其实是伪扇形,我理解的是它实际是有多个等腰三角形拼接而成的,当三角形的一边越短,所拼接出来的扇形也就越圆滑。

建立弧形路径的基本方法
1
建立弧形路径的基本方法#region 建立弧形路径的基本方法
2
/**//// <summary>
3
/// 绘制弧形
4
/// </summary>
5
/// <param name="x">弧形的圆心X</param>
6
/// <param name="y">弧形的圆心Y</param>
7
/// <param name="width">弧形所在圆外接矩形的宽度</param>
8
/// <param name="height">弧形所在圆外接矩形的高度</param>
9
/// <param name="startAngle">起始角度</param>
10
/// <param name="sweepAngle">结束角度</param>
11
public static Point[] CreateArcPath(int x, int y, int width, int height, Single startAngle, Single sweepAngle)
12
{
13
Single[] xAngle = new Single[12];//这里的数组的大小实际上决定了建立的弧形的平滑度
14
Single[] yAngle = new Single[12];
15
Point[] anglePoints = new Point[12];
16
Single angle = startAngle;
17
Single angleIncrement = (sweepAngle - startAngle) / 10;
18
for (int i = 0; i < 11; i++)
19
{
20
xAngle[i] = (float)(x + (Math.Cos(angle * (Math.PI / 180)) * (width / 2)));
21
yAngle[i] = (float)(y + (Math.Sin(angle * (Math.PI / 180)) * (height / 2)));
22
angle += angleIncrement;
23
}
24
xAngle[11] = (float)(x + (Math.Cos(sweepAngle * (Math.PI / 180)) * (width / 2)));
25
yAngle[11] = (float)(y + (Math.Sin(sweepAngle * (Math.PI / 180)) * (height / 2)));
26
anglePoints[0] = new Point(x, y);
27
for (int i = 0; i < 11; i++)
28
{
29
anglePoints[i + 1] = new Point((int)xAngle[i], (int)yAngle[i]);
30
}
31
return anglePoints;
32
}
33
#endregion
最后来说说如何填充这个图形,我们可以利用e.Graphics.FillPolygon方法来实现,代码如下:

Code
for (int i = 0; i < m_perDateItem.Length; i++)
{
sweepAngle = strartAngle + 360 * m_perDateItem[i] / 100;
totPer += m_perDateItem[i];
Point[] arcPath = PathUtil.CreateArcPath(arcCenter.X, arcCenter.Y, 170, 170, strartAngle, sweepAngle);
strartAngle = sweepAngle;
e.Graphics.FillPolygon(new SolidBrush(m_colors[i]), arcPath);
}
同样,如果我们只想绘制扇形,而不填充的话,只要调用 e.Graphics.DrawPolygon