c#绘制曲线图 类

使用GDI+绘制曲线图。
http://www.cnblogs.com/tks/archive/2007/04/17/717159.html
 
首先创建一个类Curve.cs
注意引用命名空间
using  System.Drawing;


Curve.cs内容如下:
public   class  Curve
{
    
public Curve()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }

    
private Graphics objGraphics; //Graphics 类提供将对象绘制到显示设备的方法
    private Bitmap objBitmap; //位图对象

    
private int m_Width = 640//图像宽度
    private int m_Height = 480//图像高度
    private float m_XSlice = 50//X轴刻度宽度
    private float m_YSlice = 50//Y轴刻度宽度
    private float m_YSliceValue = 20//Y轴刻度的数值宽度
    private float m_YSliceBegin = 0//Y轴刻度开始值
    private float m_Tension = 0.5f;//设置张力
    private string m_Title = "节目访问量曲线图"//Title
    private string m_Unit = "万元"//单位
    private string m_XAxisText = "日期"//X轴说明文字
    private string m_YAxisText = ""//Y轴说明文字
    private string[] m_Keys = new string[] "一月""二月""三月""四月""五月""六月""七月""八月""九月""十月""十一月""十二月" }//
    private int[] m_Values = new int[] {32,12,32,43,54,35,35,42,63,35,35,67 };//
    private Color m_BgColor = Color.Snow; //背景
    private Color m_TextColor = Color.Black; //文字颜色
    private Color m_BorderColor = Color.Black; //整体边框颜色
    private Color m_AxisColor = Color.Black; //轴线颜色
    private Color m_AxisTextColor = Color.Black; //轴说明文字颜色
    private Color m_SliceTextColor = Color.Black; //刻度文字颜色
    private Color m_SliceColor = Color.Black; //刻度颜色
    private Color m_CurveColor = Color.Red; //曲线颜色

    
public int Width
    
{
        
set
        
{
            
if (value < 300)
            
{
                m_Width 
= 300;
            }

            
else
            
{
                m_Width 
= value;
            }

        }

        
get
        
{
            
return m_Width;
        }

    }


    
public int Height
    
{
        
set
        
{
            
if (value < 300)
            
{
                m_Height 
= 300;
            }

            
else
            
{
                m_Height 
= value;
            }

        }

        
get
        
{
            
return m_Height;
        }

    }


    
public float XSlice
    
{
        
set
        
{
            m_XSlice 
= value;
        }

        
get
        
{
            
return m_XSlice;
        }

    }


    
public float YSlice
    
{
        
set
        
{
            m_YSlice 
= value;
        }

        
get
        
{
            
return m_YSlice;
        }

    }


    
public float YSliceValue
    
{
        
set
        
{
            m_YSliceValue 
= value;
        }

        
get
        
{
            
return m_YSliceValue;
        }

    }


    
public float YSliceBegin
    
{
        
set
        
{
            m_YSliceBegin 
= value;
        }

        
get
        
{
            
return m_YSliceBegin;
        }

    }


    
public float Tension
    
{
        
set
        
{
            
if (value < 0.0f && value > 1.0f)
            
{
                m_Tension 
= 0.5f;
            }

            
else
            
{
                m_Tension 
= value;
            }

        }

        
get
        
{
            
return m_Tension;
        }

    }


    
public string Title
    
{
        
set
        
{
            m_Title 
= value;
        }

        
get
        
{
            
return m_Title;
        }

    }


    
public string Unit
    
{
        
set
        
{
            m_Unit 
= value;
        }

        
get
        
{
            
return m_Unit;
        }

    }


    
public string[] Keys
    
{
        
set
        
{
            m_Keys 
= value;
        }

        
get
        
{
            
return m_Keys;
        }

    }


    
public int[] Values
    
{
        
set
        
{
            m_Values 
= value;
        }

        
get
        
{
            
return m_Values;
        }

    }


    
public Color BgColor
    
{
        
set
        
{
            m_BgColor 
= value;
        }

        
get
        
{
            
return m_BgColor;
        }

    }


    
public Color TextColor
    
{
        
set
        
{
            m_TextColor 
= value;
        }

        
get
        
{
            
return m_TextColor;
        }

    }


    
public Color BorderColor
    
{
        
set
        
{
            m_BorderColor 
= value;
        }

        
get
        
{
            
return m_BorderColor;
        }

    }


    
public Color AxisColor
    
{
        
set
        
{
            m_AxisColor 
= value;
        }

        
get
        
{
            
return m_AxisColor;
        }

    }


    
public string XAxisText
    
{
        
set
        
{
            m_XAxisText 
= value;
        }

        
get
        
{
            
return m_XAxisText;
        }

    }


    
public string YAxisText
    
{
        
set
        
{
            m_YAxisText 
= value;
        }

        
get
        
{
            
return m_YAxisText;
        }

    }


    
public Color AxisTextColor
    
{
        
set
        
{
            m_AxisTextColor 
= value;
        }

        
get
        
{
            
return m_AxisTextColor;
        }

    }


    
public Color SliceTextColor
    
{
        
set
        
{
            m_SliceTextColor 
= value;
        }

        
get
        
{
            
return m_SliceTextColor;
        }

    }


    
public Color SliceColor
    
{
        
set
        
{
            m_SliceColor 
= value;
        }

        
get
        
{
            
return m_SliceColor;
        }

    }


    
public Color CurveColor
    
{
        
set
        
{
            m_CurveColor 
= value;
        }

        
get
        
{
            
return m_CurveColor;
        }

    }



    
//生成图像并返回bmp图像对象
    public Bitmap CreateImage()
    
{
        InitializeGraph();

        DrawContent(
ref objGraphics);

        
return objBitmap;
    }


    
//初始化和填充图像区域,画出边框,初始标题
    private void InitializeGraph()
    
{

        
//根据给定的高度和宽度创建一个位图图像
        objBitmap = new Bitmap(Width, Height);

        
//从指定的 objBitmap 对象创建 objGraphics 对象 (即在objBitmap对象中画图)
        objGraphics = Graphics.FromImage(objBitmap);

        
//根据给定颜色(LightGray)填充图像的矩形区域 (背景)
        objGraphics.DrawRectangle(new Pen(BorderColor, 1), 00, Width, Height);
        objGraphics.FillRectangle(
new SolidBrush(BgColor), 11, Width - 2, Height - 2);

        
//画X轴,pen,x1,y1,x2,y2 注意图像的原始X轴和Y轴计算是以左上角为原点,向右和向下计算的
        objGraphics.DrawLine(new Pen(new SolidBrush(AxisColor), 1), 100, Height - 100, Width - 75, Height - 100);

        
//画Y轴,pen,x1,y1,x2,y2
        objGraphics.DrawLine(new Pen(new SolidBrush(AxisColor), 1), 100, Height - 10010075);

        
//初始化轴线说明文字
        SetAxisText(ref objGraphics);

        
//初始化X轴上的刻度和文字
        SetXAxis(ref objGraphics);

        
//初始化Y轴上的刻度和文字
        SetYAxis(ref objGraphics);

        
//初始化标题
        CreateTitle(ref objGraphics);
    }


    
private void SetAxisText(ref Graphics objGraphics)
    
{
        objGraphics.DrawString(XAxisText, 
new Font("宋体"10), new SolidBrush(AxisTextColor), Width / 2 - 50, Height - 50);

        
int X = 30;
        
int Y = (Height / 2- 50;
        
for (int i = 0; i < YAxisText.Length; i++)
        
{
            objGraphics.DrawString(YAxisText[i].ToString(), 
new Font("宋体"10), new SolidBrush(AxisTextColor), X, Y);
            Y 
+= 15;
        }

    }


    
private void SetXAxis(ref Graphics objGraphics)
    
{
        
int x1 = 100;
        
int y1 = Height - 110;
        
int x2 = 100;
        
int y2 = Height - 90;
        
int iCount = 0;
        
int iSliceCount = 1;
        
float Scale = 0;
        
int iWidth = (int)((Width - 200* (50 / XSlice));

        objGraphics.DrawString(Keys[
0].ToString(), new Font("宋体"10), new SolidBrush(SliceTextColor), 85, Height - 90);

        
for (int i = 0; i <= iWidth; i += 10)
        
{
            Scale 
= i * (XSlice / 50);

            
if (iCount == 5)
            
{
                objGraphics.DrawLine(
new Pen(new SolidBrush(AxisColor)), x1 + Scale, y1, x2 + Scale, y2);
                
//The Point!这里显示X轴刻度
                if (iSliceCount <= Keys.Length - 1)
                
{
                    objGraphics.DrawString(Keys[iSliceCount].ToString(), 
new Font("宋体"10), new SolidBrush(SliceTextColor), x1 + Scale - 15, y2);
                }

                
else
                
{
                    
//超过范围,不画任何刻度文字
                }

                iCount 
= 0;
                iSliceCount
++;
                
if (x1 + Scale > Width - 100)
                
{
                    
break;
                }

            }

            
else
            
{
                objGraphics.DrawLine(
new Pen(new SolidBrush(SliceColor)), x1 + Scale, y1 + 5, x2 + Scale, y2 - 5);
            }

            iCount
++;
        }

    }


    
private void SetYAxis(ref Graphics objGraphics)
    
{
        
int x1 = 95;
        
int y1 = (int)(Height - 100 - 10 * (YSlice / 50));
        
int x2 = 105;
        
int y2 = (int)(Height - 100 - 10 * (YSlice / 50));
        
int iCount = 1;
        
float Scale = 0;
        
int iSliceCount = 1;

        
int iHeight = (int)((Height - 200* (50 / YSlice));

        objGraphics.DrawString(YSliceBegin.ToString(), 
new Font("宋体"10), new SolidBrush(SliceTextColor), 60, Height - 110);

        
for (int i = 0; i < iHeight; i += 10)
        
{
            Scale 
= i * (YSlice / 50);

            
if (iCount == 5)
            
{
                objGraphics.DrawLine(
new Pen(new SolidBrush(AxisColor)), x1 - 5, y1 - Scale, x2 + 5, y2 - Scale);
                
//The Point!这里显示Y轴刻度
                objGraphics.DrawString(Convert.ToString(YSliceValue * iSliceCount + YSliceBegin), new Font("宋体"10), new SolidBrush(SliceTextColor), 60, y1 - Scale);

                iCount 
= 0;
                iSliceCount
++;
            }

            
else
            
{
                objGraphics.DrawLine(
new Pen(new SolidBrush(SliceColor)), x1, y1 - Scale, x2, y2 - Scale);
            }

            iCount
++;
        }

    }


    
private void DrawContent(ref Graphics objGraphics)
    
{
        
if (Keys.Length == Values.Length)
        
{
            Pen CurvePen 
= new Pen(CurveColor, 1);
            PointF[] CurvePointF 
= new PointF[Keys.Length];
            
float keys = 0;
            
float values = 0;
            
float Offset1 = (Height - 100+ YSliceBegin;
            
float Offset2 = (YSlice / 50* (50 / YSliceValue);

            
for (int i = 0; i < Keys.Length; i++)
            
{
                keys 
= XSlice * i + 100;
                values 
= Offset1 - Values[i] * Offset2;
                CurvePointF[i] 
= new PointF(keys, values);
            }

            objGraphics.DrawCurve(CurvePen, CurvePointF, Tension);
        }

        
else
        
{
            objGraphics.DrawString(
"Error!The length of Keys and Values must be same!"new Font("宋体"16), new SolidBrush(TextColor), new Point(150, Height / 2));
        }

    }


    
//初始化标题
    private void CreateTitle(ref Graphics objGraphics)
    
{
        objGraphics.DrawString(Title, 
new Font("宋体"16), new SolidBrush(TextColor), new Point(55));
    }

}



页面调用如下:
注意引用命名空间
using  System.Drawing;
using  System.Drawing.Imaging;

protected   void  Page_Load( object  sender, EventArgs e)
    
{
        Image1.ImageUrl 
= Server.MapPath("IMG/Curve.jpg");
        Image1.Visible 
= false;
    }

    
protected   void  Button1_Click( object  sender, EventArgs e)
    
{
        Curve curve2d 
= new Curve(); //定义一个画图类实例
        
        Bitmap bmp 
= curve2d.CreateImage();
       bmp.Save(Server.MapPath(
"IMG/Curve.jpg"), ImageFormat.Jpeg);
        
       Image1.Visible 
= true;
    }
0
0
(请您对文章做出评价)

你可能感兴趣的:(C#)