`
wangfu_02
  • 浏览: 71751 次
社区版块
存档分类
最新评论

.net使用gdi+绘半饼图

    博客分类:
  • .net
 
阅读更多

前两天web项目中遇到要绘一个半饼图,图表控件中没有这样的图,就用gdi+简单的绘了一个。

实现思路:

基于xml进行半饼图的数据提供,格式如下:

<imagedraw><imagedata data=\"100\" color=\"#1B3C72\" /><imagedata data=\"200\" color=\"#1B3Cad\" /><imagedata data=\"200\" color=\"#ffccdd\" /></imagedraw>

半饼图中每个区域可以分别指定颜色。每个区域的大小由提供数据的data属性值决定。每个区域的角度大小为:

iCurrAngle = Convert.ToInt32(当前区域数据 / 所有区域数据和 * 180);,因为是半饼图所以*180度。对于每个区域上绘制文字坐标,使用放大半径求圆弧所在点的位置的方式。

具体实现如下:

BaseDraw:绘图基类

PartPieDraw:绘半饼图实现类,主要是 RenerImage方法

 

using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Drawing2D;

/// <summary>
/// BaseDraw 的摘要说明
/// </summary>
public  class BaseDraw
{
    private int imageWidth = 0;
    private int imageHeight = 0;
    private string xmlData = "";

    public BaseDraw()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    public int ImageWidth
    {
        get { return this.imageWidth; }
        set { this.imageWidth = value; }
    }

    public int ImageHeight
    {
        get { return this.imageHeight; }
        set { this.imageHeight = value; }
    }

    public string XmlData
    {
        get { return this.xmlData; }
        set { this.xmlData = value; }
    }

    public byte[] Draw()
    {
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(this.imageWidth,this.imageHeight);
        Graphics g = Graphics.FromImage(image);
        this.RenerImage(g);
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        byte[] buffer = ms.ToArray();
        g.Dispose();
        image.Dispose();
        return buffer;
    }

    public virtual ArrayList ParseXmlData()
    {
        return null;
    }

    public virtual void RenerImage(Graphics g)
    {

    }
}

 

using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Xml;

/// <summary>
/// PartPieDraw 的摘要说明
/// </summary>
public class PartPieDraw:BaseDraw
{
    public PartPieDraw()
    {
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

    public override void RenerImage(System.Drawing.Graphics g)
    {
        ArrayList dataList = this.ParseXmlData();
        //开始计算总的数值
        double sumValue = 0.00;
        foreach (ImageData data in dataList)
        {
            sumValue += Convert.ToDouble(Math.Round(data.DrawData, 2));
        }
        sumValue = Convert.ToDouble(Math.Round(sumValue, 2));
        int iSumAngle = 180;    //总要绘的角度
        int iCurrAngle = 0;   //当前角度
        int iPosAngle = 180;   //当前角度的基值
        int iCurrSumAngle = 0;
        double dCurrBfb = 0;
        //定义半图所在的矩形区域大小,画缓的位置占整个图的2/3
        int iAreaX = Convert.ToInt32((this.ImageWidth - Convert.ToInt32(this.ImageWidth * 2 / 3)) / 2);
        int iAreaY = iAreaX;
        int iAreaWidth = Convert.ToInt32(this.ImageWidth * 2 / 3);    //长边
        int iAreaHeight = iAreaWidth;
        double r = iAreaWidth / 2;    //半径
        double rx = Convert.ToDouble(iAreaX) + r;    //圆心x
        double ry = Convert.ToDouble(iAreaY) + r;    //圆心y
        //重设置半径
        r += 20;
        g.Clear(Color.White); //清除背景
        g.SmoothingMode = SmoothingMode.AntiAlias;  //消除绘的时候的锯齿
        g.DrawRectangle(new System.Drawing.Pen(Color.Black, 1), 0, 0, this.ImageWidth, this.ImageHeight);
        for (int i = 0; i < dataList.Count; i++)
        {
            ImageData imageData = (ImageData)dataList[i];
            dCurrBfb += imageData.DrawData / sumValue * 100;
            dCurrBfb = Convert.ToDouble(Math.Round(dCurrBfb, 2));  //格式化两位小数
            if (i < dataList.Count - 1)
            {
                iCurrAngle = Convert.ToInt32(imageData.DrawData / sumValue * iSumAngle);
            }
            else
            {
                iCurrAngle = 360 - iPosAngle;
            }
            g.SmoothingMode = SmoothingMode.AntiAlias;  //消除绘的时候的锯齿
            g.FillPie(new SolidBrush(imageData.DrawColor), iAreaX, iAreaY, iAreaWidth, iAreaHeight, iPosAngle, iCurrAngle);
            g.DrawPie(new Pen(new SolidBrush(imageData.DrawColor)), iAreaX, iAreaY, iAreaWidth, iAreaHeight, iPosAngle, iCurrAngle);
            //计算绘数字
            //求圆弧所在点的位置,有偏差
            iCurrSumAngle += iCurrAngle;
            double pointX = Math.Cos(iCurrSumAngle * Math.PI / 180) * r;  //对边,
            double pointY = Math.Sin(iCurrSumAngle * Math.PI / 180) * r;  //邻边
            pointY = ry - pointY;

            pointX = rx - pointX;
            Font strFont=new Font("宋体", 12, FontStyle.Italic);
            //开始测试绘字符需要的位置
            SizeF sizeF = g.MeasureString(dCurrBfb.ToString(), strFont);

            pointX = pointX - sizeF.Width / 2;
            pointY = pointY + sizeF.Height / 2;

            g.DrawString(dCurrBfb.ToString(), strFont, new SolidBrush(Color.Red), Convert.ToInt32(pointX), Convert.ToInt32(pointY) - 20);

            iPosAngle += iCurrAngle;
            iCurrAngle = 0;
           
        }
    }

    public override ArrayList ParseXmlData()
    {
        //解析数据格式
        //<imagedraw>
        //   <imagedata data="100" color="#fff000">
        //</imagedraw>
        ArrayList dataList = new ArrayList();
        System.Xml.XmlDocument doc = new XmlDocument();
        doc.LoadXml(this.XmlData);
        System.Xml.XmlElement root = doc.DocumentElement;
        foreach (System.Xml.XmlNode node in root.ChildNodes)
        {
            string sData = node.Attributes["data"].Value;
            string sColor = node.Attributes["color"].Value;
            dataList.Add(new ImageData(sData, sColor));
        }
        return dataList;
    }

    public class ImageData
    {
        private double drawData = 0.00;
        private Color drawColor=Color.White;

        public ImageData(string data, string htmlColor)
        {
            this.drawData = Convert.ToDouble(data);
            drawColor = System.Drawing.ColorTranslator.FromHtml(htmlColor);
        }

        public double DrawData
        {
            get { return this.drawData; }
        }

        public Color DrawColor
        {
            get { return drawColor; }
        }

    }

}

 

分享到:
评论

相关推荐

    GDI+图像程序设计(PDF & 源码 -电子工业出版社)

    如果要设计.NET Framework图形应用程序,就必须使用GDI+。本书是一本为.NET开发人员讲授如何编写Windows和Web图形应用程序的专著,书中全面介绍了GDI+和Windows图形程序设计的基本知识和GDI+图形程序设计的各个方面...

    C#GDI+图形程序设计源码

    1.4 .NET中的GDI+ 名称空间和类 总结 第2章 第一个GDI+ 应用程序 2.1 绘制表面 2.2 坐标系统 2.3 指南——第一个GDI+ 应用程序 2.4 一些基本的GDI+ 对象 总结 第3章 Graphics类 3.1 Graphics类的属性 3.2 ...

    GDI+的Chart绘图

    在.NET Framework中,GDI+(Graphics Device Interface Plus)是一个强大的图形编程接口,它为开发者提供了绘制2D图形、文本和图像的能力。本教程将深入探讨如何使用C#和WinForms中的GDI+以及Chart控件来实现绘图...

    GDI+绘图综合整理源码 GMGDIShape.rar

    这是一款使用GDI+绘制不同种类形状的图形源码,代码比较实用,比较适合 新手学习交流使用,感兴趣的可以下载研究一下哦。 二、功能介绍 该源码主要实现了绘制不同种类的图形,比如矩形、多边形、椭圆、饼状图、...

    c# GDI+例子集合

    C# GDI+是.NET Framework中的图形设备接口,它提供了丰富的功能来绘制和处理图形、图像和文本。GDI+不仅适用于Windows应用程序,还可以在Web应用程序中创建动态和交互式的图形内容。本知识集合将深入探讨C# GDI+的...

    c# GDI+画图

    C#的GDI+(Graphics Device Interface Plus)是.NET Framework提供的一种图形绘制技术,它允许开发者创建丰富的2D图形和图像处理应用。本教程源码深入讲解了如何利用C#和GDI+进行画图操作,包括但不限于创建验证码、...

    网上投票源码下载(GDI+)

    4. **数据可视化**:GDI+的强大之处在于它的绘图功能,源码可能使用GDI+来生成动态的投票结果图表,如柱状图、饼图等,实时显示投票情况。 5. **安全性与权限控制**:考虑到投票系统的公正性,源码可能包含了防止...

    windows form 窗体的GDI+使用,根据数据库内容生成折线,树状,扇形图

    在C#中,可以使用ADO.NET库与数据库进行交互。`SqlConnection`、`SqlCommand`、`SqlDataReader`等类可以帮助你从SQL Server或其他兼容数据库获取数据。确保正确处理连接和读取,以避免资源泄漏。 6. **性能优化** ...

    GDIPlus库下载

    - **.NET Framework集成**:在.NET环境中,GDI+被封装在System.Drawing命名空间下,对C#、VB.NET等.NET语言提供友好支持。 - **实例化对象**:如创建Graphics对象来获取绘图上下文,创建Pen对象来设置线条样式,...

    旋转饼图+SQL数据库连接

    标题“旋转饼图+SQL数据库连接”暗示我们将探讨如何利用GDI+在Windows应用程序中创建动态的旋转饼图,并且这些饼图的数据源来自一个SQL数据库。饼图是一种常见的数据表示方式,它将数据的不同部分以扇形区展示,直观...

    C# GDI+ 绘制拄型和饼型图

    在C# 2005环境中,可以使用ADO.NET与SQL Server 2005进行数据交互,获取需要绘制的数值。通过建立数据库连接,执行SQL查询,将结果集转换为可以用于绘图的数据结构,如数组或列表。这一步骤是数据驱动绘图的关键。 ...

    GDI+图像文字处理实例大全源代码(C#)

    GDI+,全称Graphics Device Interface Plus,是Windows操作系统中用于图形、图像和文本处理的API,它在.NET Framework中以C#等编程语言的形式提供了一组丰富的类库。GDI+不仅支持基本的绘图操作,如绘制线条、填充...

    C#绘制饼图

    本文将深入探讨如何使用C#中的GDI+库来绘制饼图,帮助开发者更好地理解和实现这一功能。 首先,GDI+(Graphics Device Interface Plus)是.NET Framework提供的一套图形绘制API,它允许程序员创建、处理和呈现2D...

    c#实现动态绘制曲线图和饼图

    首先,GDI+是.NET Framework提供的一种强大的图形处理库,它允许程序员在Windows应用程序中创建和操作图形元素,包括线条、曲线、形状以及图像。对于动态绘制曲线图和饼图,我们需要理解以下几个关键概念: 1. **...

    在C#.NET中使用图形创建饼图

    在C# .NET环境中,利用GDI+(Generic Device Interface Plus)进行图形编程可以实现丰富的图形绘制,包括创建饼图。饼图是一种直观的数据展示方式,常用于展示数据比例关系。以下将详细介绍如何使用C#的Graphics类...

    asp.net 图表

    在ASP.NET中,开发者可以通过GDI+创建简单的柱状图、饼图等。要使用GDI+,我们需要引入`System.Drawing`命名空间。`Bitmap`类用于创建和保存图像,就像一个画板,而`Graphics`类则相当于画笔,用于在画板上绘制图形...

    基于ASP.NET数据图表的绘制

    在ASP.NET中,你可以利用GDI+来直接绘制图表,这需要编写较多的代码来实现各种图表元素,如线条、柱状、饼图等。优点是具有高度的灵活性和自定义性,可以精确地控制图表的每一个细节。但缺点是代码量大,且需要对...

Global site tag (gtag.js) - Google Analytics