• 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, 10204190204);
     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, 200100, startAngle, sweepAngle);
     92                            }

     93                        }

     94                        gp.FillPie(sb, pointX, pointY, 200100, startAngle, sweepAngle);
     95                        startAngle += sweepAngle;
     96                        if (single)
     97                        {
     98                            gp.FillRectangle(sb, new Rectangle(10, y, 2015));
     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, 2015));
    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, 10258190258);
    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}
  • 相关阅读:
    java中分页对象类
    java日期处理类DateUtil
    java日期处理类DateUtil
    Java Socket编程
    MySQL中TIMESTAMPDIFF和TIMESTAMPADD函数的用法
    java中用SAX方式解析xml文件
    First Demo
    软件测试面试/笔试题题库(知识的搬运工,不谢!)
    2017年 6月29 开始博客园之旅--愿自己变得更强大!
    DUIEngine使用Visual Studio 2010编译Debug_Dll版有关Error MSB3073错误解决方案
  • 原文地址:https://www.cnblogs.com/cdutedu/p/1289934.html
Copyright © 2020-2023  润新知