早就申请了博客园的空间,但是一直也没有发过文章。
这次就算个开始吧
对于GDI+,我不是很熟悉,只是工作中用到了,才现找资料学习
这次画饼状图也是一样,Web页面中需要加入统计的饼状图,没办法。
虽然最终把图画出来了,但是图上却有一条虚线去不掉,到现在也搞不懂为什么。
如下图,是最终的效果。
在黄色区域中间有一条细细的虚线。
代码如下:
这次就算个开始吧
对于GDI+,我不是很熟悉,只是工作中用到了,才现找资料学习
这次画饼状图也是一样,Web页面中需要加入统计的饼状图,没办法。
虽然最终把图画出来了,但是图上却有一条虚线去不掉,到现在也搞不懂为什么。
如下图,是最终的效果。
在黄色区域中间有一条细细的虚线。
代码如下:
using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace JRJC.Web.QuanZheng
{
/// <summary>
/// XChart 的摘要说明。
/// </summary>
public class XChart
{
/// <summary>
/// 根据传递的数组绘制饼图
/// </summary>
/// <param name="Width">宽度</param>
/// <param name="Height">高度</param>
/// <param name="dataArr">数据数组</param>
/// <param name="FileName">文件名称</param>
public static void DrawPieByArrayList(int Width, int Height, int Magin, int Blank, DataAndColorPair[] arr, string FileName)
{
Bitmap bitmap = new Bitmap(Width, Height); //图片
Graphics g = Graphics.FromImage(bitmap); //绘图
g.DrawRectangle(new Pen(Color.White),0,0,Width,Height); //边框
g.FillRectangle(new SolidBrush(Color.White), 1, 1,Width - Magin, Height - Magin);
SolidBrush brush = new SolidBrush(Color.Blue); //画笔
g.SmoothingMode = SmoothingMode.AntiAlias; //柔化
//g.DrawLine(new Pen(brush,10),1,1,10,10);
Rectangle outline = new Rectangle(Blank,Blank,Width - Blank * 2, Height - Blank * 2); //饼图范围
//绘制饼图
float total = 0;
float start = 0;
float angle = 0;
for(int i=0;i<arr.Length;i++)
{
total += arr[i].Data;
}
//Console.WriteLine(total.ToString());
for(int i=0;i<arr.Length;i++)
{
angle = (float)(arr[i].Data/total) * 360;
//Console.WriteLine(angle.ToString());
if(angle<=180)
{
Draw3DPie(ref g,arr[i].ShowColor,outline,start,angle);
}
else//如果大于180度,则将大Pie拆开两块画
{
float acuteAngle=angle-180;
Draw3DPie(ref g,arr[i].ShowColor,outline,start,acuteAngle);
Draw3DPie(ref g,arr[i].ShowColor,outline,start+acuteAngle,angle-acuteAngle);
}
//Draw3DPie(ref g,arr[i].ShowColor,outline,start,angle);
start += angle;
}
bitmap.Save(FileName, ImageFormat.Gif);
}
private static void Draw3DPie(ref Graphics g,Color brushColor,Rectangle outline,float start,float angle)
{
//以下使用HatchBrush画阴影
//if((start <135 ) || (start == 180))
if((start <135 ))
{
//深度
for(int iLoop2 = 0; iLoop2 < 10; iLoop2++)
{
g.FillPie(new HatchBrush(HatchStyle.Percent50,brushColor),
outline.X,
outline.Y + iLoop2,
outline.Width,
outline.Height,
start,
angle);
}
}
if(start == 135)
{
for(int iLoop2 = 0; iLoop2 < 10; iLoop2++)
{
g.FillPie(new HatchBrush(HatchStyle.Percent50,brushColor),
outline.X - 30,
outline.Y + iLoop2 + 15,
outline.Width,
outline.Height,
start,
angle);
}
g.FillPie(new SolidBrush(brushColor),
outline.X - 30,
outline.Y + 15,
outline.Width,
outline.Height,
start,
angle);
}
else //画pie
{
g.FillPie(new SolidBrush(brushColor), outline.X, outline.Y, outline.Width,outline.Height, start, angle);
}
//g.FillPie(new SolidBrush(arr[i].ShowColor),outline,start,angle);
}
}
}
using System.Collections;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace JRJC.Web.QuanZheng
{
/// <summary>
/// XChart 的摘要说明。
/// </summary>
public class XChart
{
/// <summary>
/// 根据传递的数组绘制饼图
/// </summary>
/// <param name="Width">宽度</param>
/// <param name="Height">高度</param>
/// <param name="dataArr">数据数组</param>
/// <param name="FileName">文件名称</param>
public static void DrawPieByArrayList(int Width, int Height, int Magin, int Blank, DataAndColorPair[] arr, string FileName)
{
Bitmap bitmap = new Bitmap(Width, Height); //图片
Graphics g = Graphics.FromImage(bitmap); //绘图
g.DrawRectangle(new Pen(Color.White),0,0,Width,Height); //边框
g.FillRectangle(new SolidBrush(Color.White), 1, 1,Width - Magin, Height - Magin);
SolidBrush brush = new SolidBrush(Color.Blue); //画笔
g.SmoothingMode = SmoothingMode.AntiAlias; //柔化
//g.DrawLine(new Pen(brush,10),1,1,10,10);
Rectangle outline = new Rectangle(Blank,Blank,Width - Blank * 2, Height - Blank * 2); //饼图范围
//绘制饼图
float total = 0;
float start = 0;
float angle = 0;
for(int i=0;i<arr.Length;i++)
{
total += arr[i].Data;
}
//Console.WriteLine(total.ToString());
for(int i=0;i<arr.Length;i++)
{
angle = (float)(arr[i].Data/total) * 360;
//Console.WriteLine(angle.ToString());
if(angle<=180)
{
Draw3DPie(ref g,arr[i].ShowColor,outline,start,angle);
}
else//如果大于180度,则将大Pie拆开两块画
{
float acuteAngle=angle-180;
Draw3DPie(ref g,arr[i].ShowColor,outline,start,acuteAngle);
Draw3DPie(ref g,arr[i].ShowColor,outline,start+acuteAngle,angle-acuteAngle);
}
//Draw3DPie(ref g,arr[i].ShowColor,outline,start,angle);
start += angle;
}
bitmap.Save(FileName, ImageFormat.Gif);
}
private static void Draw3DPie(ref Graphics g,Color brushColor,Rectangle outline,float start,float angle)
{
//以下使用HatchBrush画阴影
//if((start <135 ) || (start == 180))
if((start <135 ))
{
//深度
for(int iLoop2 = 0; iLoop2 < 10; iLoop2++)
{
g.FillPie(new HatchBrush(HatchStyle.Percent50,brushColor),
outline.X,
outline.Y + iLoop2,
outline.Width,
outline.Height,
start,
angle);
}
}
if(start == 135)
{
for(int iLoop2 = 0; iLoop2 < 10; iLoop2++)
{
g.FillPie(new HatchBrush(HatchStyle.Percent50,brushColor),
outline.X - 30,
outline.Y + iLoop2 + 15,
outline.Width,
outline.Height,
start,
angle);
}
g.FillPie(new SolidBrush(brushColor),
outline.X - 30,
outline.Y + 15,
outline.Width,
outline.Height,
start,
angle);
}
else //画pie
{
g.FillPie(new SolidBrush(brushColor), outline.X, outline.Y, outline.Width,outline.Height, start, angle);
}
//g.FillPie(new SolidBrush(arr[i].ShowColor),outline,start,angle);
}
}
}