c#绘制曲线图

转载 2012年03月23日 15:37:04
首先创建一个类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;
    }

相关文章推荐

C#绘制曲线图

[图片] 曲线图效果 [代码] [C#]代码 view source print? 01 /// 02 ...

C# Chart控件,chart、Series、ChartArea曲线图绘制的重要属性

转自:原文链接 原文有备份,如有错误和需要改进的地方,请不吝指正Chart控件,chart、Series、ChartArea曲线图绘制的重要属性" title="C# C...

C# 绘制曲线图,并保存为Gif格式文件 调试通过

protected void ShowIm()     {         //数据初始化         string[] month = new string[12] { "1", "2",...

C# Chart控件,chart、Series、ChartArea曲线图绘制的重要属性

原文有备份,如有错误和需要改进的地方,请不吝指正Chart控件,chart、Series、ChartArea曲线图绘制的重要属性" title="C# Chart控件,chart、Series、Cha...

用C#绘制实时曲线图

本文转自 http://blog.csdn.net/zhoufoxcn/article/details/2682027 在实际项目中我们经常需要绘制一些实时的数据图片,比如当前各公司的用...

用ASP.NET with C# 绘制曲线图(Curve图)

文件描述#region 文件描述 // -------------------------------------------------------------------------------...

初涉C#之读取txt文件并绘制坐标曲线图

这两天由于各种原因,不得不迫使自己学些傍身的东西。所以开始找一些编程语言来武装武装自己。C#没有C++那么复杂,但也相对于VB要高级一些,或许是个不错的选择呢。这两天看了下读取文本数据的资料,也在网上...
  • q2129
  • q2129
  • 2014年03月07日 15:15
  • 2913

C#语言绘制实时曲线图代码实例

本文将讲述利用C#语言绘制一个实时曲线图,可用来显示CPU的使用频率以及播放声音视频时实时显示当前的声频等等!   为了操作和应付变化,所以将绘制曲线图的功能单独封装成一个类,里面的数据完全是模拟...
  • wj2012
  • wj2012
  • 2011年10月15日 15:47
  • 984

C#绘制曲线图和柱状图

在我们程序开发的过程中经常会需要绘制曲线图和柱状图等,尤其是在做统计功能时。但是有时候我们有觉得没有必要使用第三方控件(例如:ZedGraph等),这是我们可以自己编写代码来实现这些图形绘制的功能。以...

C#绘制曲线图

  • 2011年11月29日 00:14
  • 191KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#绘制曲线图
举报原因:
原因补充:

(最多只允许输入30个字)