用C#绘制曲线图.doc_第1页
用C#绘制曲线图.doc_第2页
用C#绘制曲线图.doc_第3页
用C#绘制曲线图.doc_第4页
用C#绘制曲线图.doc_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用C#绘制曲线图照例先上图:比以前Cool吧?呵呵,其实就是根据数据自动计算边距和字体等./自动根据参数调整图像大小/Public void Fit()/计算字体距离intFontSpace=FontSize+5;/计算图像边距Float fltSpace=Math.Min(Width/6, Height/6);XSpace=fltSpace;YSpace=fltSpace;/计算X轴刻度宽度XSlice=(Width-2*XSpace)/(Keys.Length-1);/计算Y轴刻度宽度和Y轴刻度开始值float fltMinValue=0;float fltMaxValue=0;for(int i=0;iValues.Length;i+)if(ValuesifltMaxValue)fltMaxValue=Valuesi;if(YSliceBeginfltMinValue)YSliceBegin= fltMinValue;int intYSliceCount=(int)(fltMaxValue/YSliceValue);if(fltMaxValue%YSliceValue!=0)intYSliceCount+;YSlice=(Height-2*YSpace)/intYSliceCount;看我把数据缩小一个级别的效果:因为代码里面充斥了大量注释,也不敲太多文字了.完整代码奉上:usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Drawing;usingSystem.Data;usingSystem.Drawing.Drawing2D;namespaceSarchPMS.Business.DrawpublicclassDrawingCurve:DrawingChart/画曲线图/publicoverrideBitmapDrawImage(DataSetdsParameter)Curve2Dcuv2D=newCurve2D();cuv2D.Fit();returncuv2D.CreateImage();publicclassCurve2DprivateGraphicsobjGraphics;/Graphics类提供将对象绘制到显示设备的方法privateBitmapobjBitmap;/位图对象privatefloatfltWidth=480;/图像宽度privatefloatfltHeight=248;/图像高度privatefloatfltXSlice=50;/X轴刻度宽度privatefloatfltYSlice=50;/Y轴刻度宽度privatefloatfltYSliceValue=20;/Y轴刻度的数值宽度privatefloatfltYSliceBegin=0;/Y轴刻度开始值privatefloatfltTension=0.5f;privatestringstrTitle=曲线图;/标题privatestringstrXAxisText=月份;/X轴说明文字privatestringstrYAxisText=万元;/Y轴说明文字privatestringstrsKeys=newstring一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月;/键privatefloatfltsValues=newfloat20.0f,30.0f,50.0f,55.4f,21.6f,12.8f,99.5f,36.4f,78.2f,56.4f,45.8f,66.5f,99.5f,36.4f,78.2f,56.4f,45.8f,66.5f,20.0f,30.0f,50.0f,55.4f,21.6f,12.8f;/值privateColorclrBgColor=Color.Snow;/背景色privateColorclrTextColor=Color.Black;/文字颜色privateColorclrBorderColor=Color.Black;/整体边框颜色privateColorclrAxisColor=Color.Black;/轴线颜色privateColorclrAxisTextColor=Color.Black;/轴说明文字颜色privateColorclrSliceTextColor=Color.Black;/刻度文字颜色privateColorclrSliceColor=Color.Black;/刻度颜色privateColorclrsCurveColors=newColorColor.Red,Color.Blue;/曲线颜色privatefloatfltXSpace=100f;/图像左右距离边缘距离privatefloatfltYSpace=100f;/图像上下距离边缘距离privateintintFontSize=9;/字体大小号数privatefloatfltXRotateAngle=30f;/X轴文字旋转角度privatefloatfltYRotateAngle=0f;/Y轴文字旋转角度privateintintCurveSize=2;/曲线线条大小privateintintFontSpace=0;/intFontSpace是字体大小和距离调整出来的一个比较适合的数字#region公共属性/图像的宽度/publicfloatWidthsetif(value100)fltWidth=100;elsefltWidth=value;getif(fltWidth=100)return100;elsereturnfltWidth;/图像的高度/publicfloatHeightsetif(value100)fltHeight=100;elsefltHeight=value;getif(fltHeight=100)return100;elsereturnfltHeight;/X轴刻度宽度/publicfloatXSlicesetfltXSlice=value;getreturnfltXSlice;/Y轴刻度宽度/publicfloatYSlicesetfltYSlice=value;getreturnfltYSlice;/Y轴刻度的数值宽度/publicfloatYSliceValuesetfltYSliceValue=value;getreturnfltYSliceValue;/Y轴刻度开始值/publicfloatYSliceBeginsetfltYSliceBegin=value;getreturnfltYSliceBegin;/张力系数/publicfloatTensionsetif(value1.0f)fltTension=0.5f;elsefltTension=value;getreturnfltTension;/标题/publicstringTitlesetstrTitle=value;getreturnstrTitle;/键,X轴数据/publicstringKeyssetstrsKeys=value;getreturnstrsKeys;/值,Y轴数据/publicfloatValuessetfltsValues=value;getreturnfltsValues;/背景色/publicColorBgColorsetclrBgColor=value;getreturnclrBgColor;/文字颜色/publicColorTextColorsetclrTextColor=value;getreturnclrTextColor;/整体边框颜色/publicColorBorderColorsetclrBorderColor=value;getreturnclrBorderColor;/轴线颜色/publicColorAxisColorsetclrAxisColor=value;getreturnclrAxisColor;/X轴说明文字/publicstringXAxisTextsetstrXAxisText=value;getreturnstrXAxisText;/Y轴说明文字/publicstringYAxisTextsetstrYAxisText=value;getreturnstrYAxisText;/轴说明文字颜色/publicColorAxisTextColorsetclrAxisTextColor=value;getreturnclrAxisTextColor;/刻度文字颜色/publicColorSliceTextColorsetclrSliceTextColor=value;getreturnclrSliceTextColor;/刻度颜色/publicColorSliceColorsetclrSliceColor=value;getreturnclrSliceColor;/曲线颜色/publicColorCurveColorssetclrsCurveColors=value;getreturnclrsCurveColors;/X轴文字旋转角度/publicfloatXRotateAnglegetreturnfltXRotateAngle;setfltXRotateAngle=value;/Y轴文字旋转角度/publicfloatYRotateAnglegetreturnfltYRotateAngle;setfltYRotateAngle=value;/图像左右距离边缘距离/publicfloatXSpacegetreturnfltXSpace;setfltXSpace=value;/图像上下距离边缘距离/publicfloatYSpacegetreturnfltYSpace;setfltYSpace=value;/字体大小号数/publicintFontSizegetreturnintFontSize;setintFontSize=value;/曲线线条大小/publicintCurveSizegetreturnintCurveSize;setintCurveSize=value;#endregion/自动根据参数调整图像大小/publicvoidFit()/计算字体距离intFontSpace=FontSize+5;/计算图像边距floatfltSpace=Math.Min(Width/6,Height/6);XSpace=fltSpace;YSpace=fltSpace;/计算X轴刻度宽度XSlice=(Width-2*XSpace)/(Keys.Length-1);/计算Y轴刻度宽度和Y轴刻度开始值floatfltMinValue=0;floatfltMaxValue=0;for(inti=0;iValues.Length;i+)if(ValuesifltMaxValue)fltMaxValue=Valuesi;if(YSliceBeginfltMinValue)YSliceBegin=fltMinValue;intintYSliceCount=(int)(fltMaxValue/YSliceValue);if(fltMaxValue%YSliceValue!=0)intYSliceCount+;YSlice=(Height-2*YSpace)/intYSliceCount;接上文: /生成图像并返回bmp图像对象/publicBitmapCreateImage()InitializeGraph();intintKeysCount=Keys.Length;intintValuesCount=Values.Length;if(intValuesCount%intKeysCount=0)intintCurvesCount=intValuesCount/intKeysCount;for(inti=0;iintCurvesCount;i+)floatfltCurrentValues=newfloatintKeysCount;for(intj=0;jintKeysCount;j+)fltCurrentValuesj=Valuesi*intKeysCount+j;DrawContent(refobjGraphics,fltCurrentValues,clrsCurveColorsi);elseobjGraphics.DrawString(发生错误,Values的长度必须是Keys的整数倍!,newFont(宋体,FontSize+5),newSolidBrush(TextColor),newPoint(int)XSpace,(int)(Height/2);returnobjBitmap;/初始化和填充图像区域,画出边框,初始标题/privatevoidInitializeGraph()/根据给定的高度和宽度创建一个位图图像objBitmap=newBitmap(int)Width,(int)Height);/从指定的objBitmap对象创建objGraphics对象(即在objBitmap对象中画图)objGraphics=Graphics.FromImage(objBitmap);/根据给定颜色(LightGray)填充图像的矩形区域(背景)objGraphics.DrawRectangle(newPen(BorderColor,1),0,0,Width-1,Height-1);/画边框objGraphics.FillRectangle(newSolidBrush(BgColor),1,1,Width-2,Height-2);/填充边框/画X轴,注意图像的原始X轴和Y轴计算是以左上角为原点,向右和向下计算的floatfltX1=XSpace;floatfltY1=Height-YSpace;floatfltX2=Width-XSpace+XSlice/2;floatfltY2=fltY1;objGraphics.DrawLine(newPen(newSolidBrush(AxisColor),1),fltX1,fltY1,fltX2,fltY2);/画Y轴fltX1=XSpace;fltY1=Height-YSpace;fltX2=XSpace;fltY2=YSpace-YSlice/2;objGraphics.DrawLine(newPen(newSolidBrush(AxisColor),1),fltX1,fltY1,fltX2,fltY2);/初始化轴线说明文字SetAxisText(refobjGraphics);/初始化X轴上的刻度和文字SetXAxis(refobjGraphics);/初始化Y轴上的刻度和文字SetYAxis(refobjGraphics);/初始化标题CreateTitle(refobjGraphics);/初始化轴线说明文字/privatevoidSetAxisText(refGraphicsobjGraphics)floatfltX=Width-XSpace+XSlice/2-(XAxisText.Length-1)*intFontSpace;floatfltY=Height-YSpace-intFontSpace;objGraphics.DrawString(XAxisText,newFont(宋体,FontSize),newSolidBrush(AxisTextColor),fltX,fltY);fltX=XSpace+5;fltY=YSpace-YSlice/2-intFontSpace;for(inti=0;iYAxisText.Length;i+)objGraphics.DrawString(YAxisTexti.ToString(),newFont(宋体,FontSize),newSolidBrush(AxisTextColor),fltX,fltY);fltY+=intFontSpace;/字体上下距离/初始化X轴上的刻度和文字/privatevoidSetXAxis(refGraphicsobjGraphics)floatfltX1=XSpace;floatfltY1=Height-YSpace;floatfltX2=XSpace;floatfltY2=Height-YSpace;intiCount=0;intiSliceCount=1;floatScale=0;floatiWidth=(Width-2*XSpace)/XSlice)*50;/将要画刻度的长度分段,并乘以50,以10为单位画刻度线。floatfltSliceHeight=XSlice/10;/刻度线的高度objGraphics.TranslateTransform(fltX1,fltY1);/平移图像(原点)objGraphics.RotateTransform(XRotateAngle,MatrixOrder.Prepend);/旋转图像objGraphics.DrawString(Keys0.ToString(),newFont(宋体,FontSize),newSolidBrush(SliceTextColor),0,0);objGraphics.ResetTransform();/重置图像for(inti=0;i=iWidth;i+=10)/以10为单位Scale=i*XSlice/50;/即(i/10)*(XSlice/5),将每个刻度分五部分画,但因为i以10为单位,得除以10if(iCount=5)objGraphics.DrawLine(newPen(newSolidBrush(AxisColor),fltX1+Scale,fltY1+fltSliceHeight*1.5f,fltX2+Scale,fltY2-fltSliceHeight*1.5f);/画网格虚线PenpenDashed=newPen(newSolidBrush(AxisColor);penDashed.DashStyle=DashStyle.Dash;objGraphics.DrawLine(penDashed,fltX1+Scale,fltY1,fltX2+Scale,YSpace-YSlice/2);/这里显示X轴刻度if(iSliceCountWidth-XSpace)break;elseobjGraphics.DrawLine(newPen(newSolidBrush(SliceColor),fltX1+Scale,fltY1+fltSliceHeight,fltX2+Scale,fltY2-fltSliceHeight);iCount+;/初始化Y轴上的刻度和文字/privatevoidSetYAxis(refGraphicsobjGraphics)floatfltX1=XSpace;floatfltY1=Height-YSpace;floatfltX2=XSpace;floatfltY2=Height-YSpace;intiCount=0;floatScale=0;intiSliceCount=1;floatiHeight=(Height-2*YSpace)/YSlice)*50;/将要画刻度的长度分段,并乘以50,以10为单位画刻度线。floatfltSliceWidth=YSlice/10;/刻度线的宽度stringstrSliceText=string.Empty;objGraphics.TranslateTransform(XSpace-intFontSpace*YSliceBegin.ToString().Length,Height-YSpace);/平移图像(原点)objGraphics.RotateTransform(YRotateAngle,MatrixOrder.Prepend);/旋转图像objGraphics.DrawString(YSliceBegin.ToString(),newFont(宋体,FontSize),newSolidBrush(SliceTextColor),0,0);objGraphics.ResetTransform();/重置图像for(inti=0;iiHeight;i+=10)Scale=i*YSlice/50;/即(i/10)*(YSlice/5),将每个刻度分五部分画,但因为i以10为单位,得除以10if(iCount=5)objGraphics.DrawLine(newPen(newSolidBrush(AxisColor),fltX1-fltSliceWidth*1.5f,fltY1-Scale,fltX2+fltSliceWidth*1.5f,fltY2-Scale);/画网格虚线PenpenDashed=newPen(newSolidBrush(AxisColor);penDashed.DashStyle=DashStyle.Dash;objGraphics.DrawLine(penDashed,XSpace,fltY1-Scale,Width-XSpace+XSlice/2,fltY2-Scale);/这里显示Y轴刻度strSliceText=Convert.ToString(YSliceValue*iSliceCount+YSliceBegin);objGraphics.TranslateTransform(XSpace-intFontSize*strSliceText.Length,fltY1-Scale);/平移图像(原点)objGraphics.RotateTransform(YRotateAngle,MatrixOrder.Prepend);/旋转图像objGraphics.DrawString(strSliceText,newFont(宋体,FontSize),newSolidBrush(SliceTextColor),0,0);objGraphics.ResetTransform();/重置图像iCount=0;iSliceCount+;elseobjGraphics.DrawLine(newPen(newSolidBrush(SliceColor),fltX1-fltSliceWidth,fltY1-Scale,fltX2+fltSliceWidth,fltY2-Scale);iCount+;/画曲线/privatevoidDrawContent(refGraphicsobjGraphics,floatfltCurrentValues,ColorclrCurrentColor)PenCurvePen=newPen(clrCurrentColor,CurveSize);PointFCurvePointF=newPointFKeys.Length;floatkeys=0;floatvalues=0;for(inti=0;iKeys.Length;i+)keys=XSlice*i+XSpace;values=(Height-YSpace)+YSliceBegin-YSlice*(fltCurrentValuesi/YSliceValue);CurvePointFi=newPointF(keys,values);objGraphics.DrawCurve(CurvePen,CurvePointF,Tension);/初始化标题/privatevoidCreateTitle(refGraphicsobjGraphics)objGraphics.DrawString(Title,newFont(宋体,FontSize),newSolidBrush(TextColor),newPoint(int)(Width-XSpace)-intFontSize*Title.Length,(int)(YSpace-YSlice/2-intFontSpace);一个较能通用的C#画曲线类源码如下,思想以后面机会再说明: 曲线类返回一个画好的图片曲线类源码开始using System;using System.Collections.Generic;using System.Text;using System.Drawing;namespace testPictureBox public class CurvePaint public CurvePaint() /刻度线条数 private int _X_KeduCount=12; private int _Y_KeduCount=12; /刻度值位置对应刻度线左移像素 private float _X_valueStrMoveleft=5f; private float _Y_valueStrMoveleft=45f; /格式化刻度值 private string _X_Format = #0.0; private string _Y_Format = #0.00; /X轴刻度值文字方向 private bool _X_DirectionVertical = false; public int XkeduCount get return _X_KeduCount; set _X_KeduCount = value; public int YkeduCount get return _Y_KeduCount; set _Y_KeduCount = value; public float XvalueStrMoveleft get return _X_valueStrMoveleft; set _X_valueStrMoveleft = value; public float YvalueStrMoveleft get return _Y_valueStrMoveleft; set _Y_valueStrMoveleft = value; public bool XdirectionVertical get return _X_DirectionVertical; set _X_DirectionVertical = value; public string Xformat get return _X_Format; set _X_Format = value; public string Yformat get return _Y_Format; set _Y_Format = value; private void setExtremeVal

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论