首页 > 开发 > 综合 > 正文

C#绘图(可以处理负值)

2024-07-21 02:17:31
字体:
来源:转载
供稿:网友
  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!
  •  

    using system;
    using system.io;//用于文件存取
    using system.data;//用于数据访问
    using system.drawing;//提供画gdi+图形的基本功能
    using system.drawing.text;//提供画gdi+图形的高级功能
    using system.drawing.drawing2d;//提供画高级二维,矢量图形功能
    using system.drawing.imaging;//提供画gdi+图形的高级功能


    namespace drawpicture
     {
      /// <summary>
      /// barchart 的摘要说明。
      /// </summary>
      public class barchart
      {
       private   int pic_width = 410;
       private   int pic_height = 320;
               
       public static bool hasneg = false;

       private const string fontword = "arial";
       private const int fontsize = 9;

       public  int side_width = 400;
       public  int side_height = 400;
       private const int chart_top = 60;
       private  int chart_height = 300;
       private const int chart_left = 60;
       private const int chart_width = 300;

       public void render(string[] word,int[] data, out string filename)
       {
        
        for(int i=0;i<data.length;i++)
        {
         if(data[i]<0)
         {
          pic_height *=2;
          hasneg = true;
          side_height = (int)(side_height*1.5);
          chart_height =(int)(chart_height*0.3);
          break;
         }
        }
        chartutil cu = new chartutil();

        pointf[] zuobiaostart;
        pointf[] zuobiaoend;
        graphics g;
        bitmap bm;
        createcanvas(out bm, out g, out zuobiaoend, out zuobiaostart,cu);

        //画坐标轴
        int chidu = drawaxes(data, zuobiaostart, g, zuobiaoend,cu);

        //画条形图
        float barwidth = chart_width / (2 * 2);
        pointf barorigin = new pointf(chart_left + (barwidth / 2),0);
        float barheight = 2;
        for(int i=0;i<2;i++)
        {
         barheight = ((float)data[i]/chidu) *(chart_height/5) ;
         if(barheight<0)
         {
          barorigin.y = chart_top + chart_height;
         }
         else
         {
          barorigin.y = chart_top + chart_height - barheight;
         }
         
         g.fillrectangle(new solidbrush(chartutil.getchartitemcolor(i)),barorigin.x,barorigin.y,barwidth,math.abs(barheight));
         barorigin.x = barorigin.x + (barwidth * 2);
        }
        
      
        //画右上角的说明图形
        drawinstruction(chart_left, chart_height, chart_top, g, word, data);

        //输出图形
        filename = cu.picpath + guid.newguid().tostring() + ".gif";
        bm.save(filename, imageformat.gif);
      
        //资源回收
        bm.dispose();
        g.dispose();
       }

       private  int drawaxes(int[] data, pointf[] zuobiaostart, graphics g, pointf[] zuobiaoend,chartutil cu)
       {
        int chidu =1;
        int[] t = cu.getzuobiaovalue(data,out chidu);
        for(int i=0;i<zuobiaostart.length;i++)
        {
         pointf txtpos = new pointf();
         txtpos.x = zuobiaostart[i].x -50;
         txtpos.y = zuobiaostart[i].y - 5;
         g.drawstring(t[i].tostring(),new font(fontword,8),brushes.black,txtpos);
         g.drawline(pens.black,zuobiaostart[i],zuobiaoend[i]);   
        }
        return chidu;
       }

       private  void createcanvas(out bitmap bm, out graphics g, out pointf[] zuobiaoend, out pointf[] zuobiaostart,chartutil cu)
       {
        //建立一个graphics对象实例
        bm = new bitmap(pic_width,pic_height);
        g = graphics.fromimage(bm);
        //设置条图图形和文字属性

        g.scaletransform((convert.tosingle(pic_width))/side_width,(convert.tosingle(pic_height))/side_height);
        g.smoothingmode = smoothingmode.default;
        g.textrenderinghint = textrenderinghint.antialias;
     
        //设定画布和边
        g.clear(color.white);
        g.drawrectangle(pens.black,0,0,side_width-1,side_height-1);
     
        //设置条形图的边
        g.drawrectangle(new pen(color.black,1),chart_left,chart_top,chart_width, chart_height);
        if(hasneg)
        {
         g.drawrectangle(new pen(color.black,1),chart_left,chart_top+chart_height,chart_width, chart_height);
        }

        zuobiaoend = null;
       zuobiaostart = cu.getzuobiaopoint(new pointf(chart_top,chart_left),chart_height,chart_width,out zuobiaoend,hasneg);
       }

       private  void drawinstruction(int chart_left, int chart_height, int chart_top, graphics g, string[] word, int[] data)
       {
        pointf colsnamepoint = new pointf(chart_left + 55,chart_height + chart_top + 2);
        if(hasneg)
        {
         colsnamepoint = new pointf(chart_left + 55,chart_height*2 + chart_top + 2);
        }
        
        pointf boxorigin = new pointf(pic_width*5/6-30,chart_top*1/3);
        pointf textorigin = new pointf(pic_width*4/5+8,chart_top*1/3 -3 );
        for(int i=0;i<2;i++)
        {
         g.fillrectangle(new solidbrush(chartutil.getchartitemcolor(i)),boxorigin.x,boxorigin.y,20,10);
         //g.drawrectangle(pens.black,boxorigin.x,boxorigin.y,20,10);
         g.drawstring(word[i],new font(fontword,fontsize),brushes.darkblue,colsnamepoint);
         g.drawstring(data[i].tostring(),new font(fontword,fontsize),brushes.black,textorigin);
         colsnamepoint.x += 150;
         boxorigin.y += 15;
         textorigin.y += 15;
        }
       }
      }
      public class chartutil
      {
       
       public  readonly string picpath = system.appdomain.currentdomain.basedirectory + "temp/";

       public  pointf[] getzuobiaopoint(pointf orign,int height,int width,out pointf[] endpoint,bool hasneg)
       {
        int num = 6;
        if(hasneg) num = 11;
        pointf[] startpoint = new pointf[num];
        endpoint = new pointf[num];

        for(int i =0;i<num;i++)
        {
         pointf pfstart = new pointf();
         pointf pfend = new pointf();
         pfstart.x = orign.x;
         pfend.x = orign.x + width;
         pfstart.y = orign.y + i*height/5;
         pfend.y = pfstart.y;
         startpoint[i] = pfstart;
         endpoint[i] = pfend;
        }
        return startpoint;
       }
       public  int[] getzuobiaovalue(int[] data,out int chidu)
       {
        int[] result = new int32[11];
        int max = data[0];
        
        for(int i=0;i<data.length;i++)
        {
         if(max < data[i])
          max = data[i];
        }
        string strmax = max + "";
        chidu =(int)((convert.toint32(strmax.substring(0,1)) +1)* math.pow(10,strmax.length-1))/5;
        for(int i=0;i<result.length;i++)
        {
         result[i] = chidu* (5-i) ;
        }
        return result;
       }
       
       #region get color
       public static color getchartitemcolor(int itemindex)
       {
        color selectedcolor;
        switch(itemindex)
        {
         case 0:
          selectedcolor = color.blue;
          break;
         case 1:
          selectedcolor = color.red;
          break;
         case 2:
          selectedcolor = color.yellow;
          break;
         case 3:
          selectedcolor = color.purple;
          break;
         default:
          selectedcolor = color.green;
          break;
        }
        return selectedcolor;
       }
       #endregion
      }
     }

    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表