用C#绘制曲线图.pdf
《用C#绘制曲线图.pdf》由会员分享,可在线阅读,更多相关《用C#绘制曲线图.pdf(107页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、用 C#绘制曲线图照例先上图:比以前Cool吧?呵呵,其实就是根据数据自动计算边距和字体等./自动根据参数调整图像大小/Public void Fit()(/计算字体距离intFontS pace=FontS ize+5;/计算图像边距Float fltS pace=Math.Min(Width/6,Height/6);XS pace=fltS pace;YS pace=fltS pace;计算X 轴刻度宽度XS Iice=(Width-2*XS pace)/(Keys.Length-1);计算Y 轴刻度宽度和Y 轴刻度开始值float 租MinValue=O;float fltMaxValu
2、e=O;for(int i=O;iValues.Length;i+)(if(ValuesifltMaxValue)(fltMaxValue=Valuesi;)if(YS IiceBeginfltMinValue)(YS IiceBegin=fltMinValue;)int intYS IiceCount=(int)(fltMaxValue/YS IiceValue);if(fltMaxValue%YS IiceValue!=O)(intYS IiceCount+;)YS Iice=(Height-2*YS pace)/intYS IiceCount;看我把数据缩小一个级别的效果:因为代码里面充
3、斥了大量注释,也不敲太多文字了.完整代码奉上:/#region公共属性/Y 轴刻度宽度/Y轴说明文字/setfltXRotateAngle=value;/自动根据参数调整图像大小接上文:ht/2);floatfltYI=Height-YS pace;一个较能通用的C#画曲线类源码如下,思想以后面机会再说明:曲线类返回一个画好的图片曲线类源码开始-using System;using System.Collections.Generic;using System.Text;using System.Drawing;namespace testPictureBoxpublic class Curv
4、ePaintpublic 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;pub
5、lic int XkeduCountget 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_val
6、ueStrMoveleft=value;public bool XdirectionVerticalget 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 setExtremeValues(float arr,ref float smallest
7、Value,ref float greatestValue)(if(arr=null|arr.Length=0)throw new Exception(用于绘曲线图的数组为空”);smallest Value=arr0;greatestValue=arr0;for(int i=1;i aiTi)smallestValue=aiTi;if(greatestValue arrfi)greatestValue=arri;private void setKeduStringArray(lloat keduArr,float increment)(for(int i=1;i keduArr.Length
8、;i+)keduArri=keduAiTi-1+increment;)/数据规格化f(x)=ax+bprivate float Standard(float x,float A,float B,float C,float D)(return C*(A*x+B)+D;)public Bitmap drawCurve(float X_array,float Y_array,string chartTitle,string X_title,string Y_title)画图初始化Bitmap bmap=new Bitmap(500,500);图片.大、Graphics gph=Graphics.Fr
9、omlmage(bmap);gph.Clear(Color.White);曲线图左、下、右、上的空隙均为60像素PointF cpt=new PointF(60f,bmap.Height-60f);坐标原点,坐标轴起始点(60,440)PointF X.EndPoint=new PointF(bmap.Width-60f,cpt.Y);/X 轴终点(440,440)PointF Y_EndPoint=new PointF(cpt.X,60f);/Y 轴终点(60,60)坐标轴三角形箭头PointFJ xpt=new PointF3 new PointF(X_EndPoint.X+15,X_En
10、dPoint.Y),newPointF(X_EndPoint.X,X_EndPoint.Y-4),new PointF(X_EndPoint.X,X_EndPoint.Y+4);/x轴三角形PointF ypt=new PointF3 new PointF(Y_EndPoint.X,Y_EndPoint.Y-15),newPointF(Y_EndPoint.X-4,Y_EndPoint.Y),new PointF(Y_EndPoint.X+4,Y_EndPoint.Y);/y轴三角形画图表标题gph.DrawString(chartTitle,new Font(“宋体,14),Brushes.
11、Black,newPointF(Y_EndPoint.X+60,Y_EndPoint.Y-30);图表标题画x 轴三角箭头、标题gph.DrawLine(Pens.Black,cpt.X,cpt.Y,X_EndPoint.X,X_EndPoint.Y);gph.DrawPolygon(Pens.Black,xpt);gph.FillPolygon(new SolidBrush(Color.Black),xpt);gph.DrawString(X_title,new Font(“宋体”,12),Brushes.Black,newPointF(X_EndPoint.X+10,X_EndPoint.
12、Y+10);画y 轴三角箭头、标题gph.DrawLine(Pens.Black,cpt.X,cpt.Y,Y_EndPoint.X,Y_EndPoint.Y);gph.DrawPolygon(Pens.Black,ypt);gph.FillPolygon(new SolidBrush(Color.Black),ypt);gph.DrawString(Y_title,new Font(“宋体,12),Brushes.Black,new PointF(0,Y_EndPoint.Y-30);float X_smallestValue=Of,X_greatestValue=Of;float Y_sma
13、llestValue=Of,Y_greatestValue=Of;猎取横、纵坐标的最大最小值setExtremeValues(X_array,ref X_smallestValue,ref X_greatestValue);setExtremeValues(Y_array,ref Y_smallestValue,ref Y_greatestValue);增量=(最大值一最小值)float X_Increment=(X_greatestValue-X_smallestValue);float YJncrement=(Y_greatestValue-Y_smallestValue);平均增量=(最
14、大值一最小值)/刻度间隔数,刻度间隔数=刻度线数一 1float X_AvgIncrement=X_Increment/(XkeduCount-1);float Y_AvgIncrement=Y_Increment/(YkeduCount-1);float X.KeduArr=new floatXkeduCount;/X 轴刻度值floatf Y_KeduArr=new floatYkeduCount;/Y 轴刻度值X_KeduArrO=X_smallest Value;Y_KeduArrOJ=Y_smal lest V al ue;/给刻度值数组赋值setKeduStringArray(X_
15、KeduArr,X_AvgIncrement);setKeduStringArray(Y_KeduArr,Y_AvgIncrement);刻度线起始位置PointF X_KeduStart=new PointF(cpt.X+30,cpt.Y);(90,440)x 轴第一根刻度线PointF X_KeduEnd=new PointF(X_EndPoint.X-10,X_EndPoint.Y);(430,440)x 轴最后一根刻度线PointF Y_KeduStart=new PointF(cpt.X,cpt.Y-30);(60,410)y 轴第一根刻度线PointF Y_KeduEnd=new
16、PointF(Y_EndPoint.X,Y_EndPoint.Y+10);/(60,70)y 轴最后一根刻度线刻度线位置坐标平均增量float X_KeduIncrement=(X_KeduEnd.X-X_KeduStart.X)/(XkeduCount-1);float Y_KeduIncrement=(Y_KeduStart.Y-Y_KeduEnd.Y)/(YkeduCount-1);设置X 轴刻度值显示方向StringFormat X_StringFormat=new StringFormat();if(XdirectionVertical)(X_StringFormat.FormatF
17、lags=StringFormatFlags.DirectionVertical;)画x 轴刻度线、刻度值for(int i=1;i=XkeduCount;i+)(if(i=1)(gph.DrawString(X_KeduArri-1 .ToString(Xformat),new Font(nTimes NewRoman,11),Brushes.Black,new PointF(X_KeduStart.X-XvalueStrMoveleft,X_KeduStart.Y+5),X_StringFormat);/new StringFormat(StringFormatFlags.Directio
18、nVertical);/SJn 一个参数实现文字竖排,默认为横排gph.DrawLine(Pens.LightGray,X_KeduStart.X,X_KeduStart.Y,X_KeduStart.X,Y_EndPoint.Y);elsegph.DrawString(X_KeduArri-1 .ToString(Xformat),new Font(Times NewRoman1,11),Brushes.Black,new PointF(X_KeduStart.X+(i-1)*X_KeduIncrement-XvalueStrMoveleft,cpt.Y+5),X_StringFormat);
19、/newStringFormat(StringFormatFlags.DirectionVertical);/最后一个参数实现文字竖排,默认为横排gph.DrawLine(Pens.LightGray,X_KeduStart.X+(i-1)*X_KeduIncrement,cpt.Y,X_KeduStart.X+(i-1)*X_KeduIncrement,Y_EndPoint.Y);)画y 轴刻度线、刻度值for(int i=1;i=YkeduCount;i+)(if(i=1)(gph.DrawString(Y_KeduArri-l.ToString(Yformat),new Font(nTi
20、mes NewRoman*,11),Brushes.Black,new PointF(Y_KeduStart.X-YvalueStrMoveleft,Y_KeduStarl.Y-6);gph.DrawLine(Pens.LightGray,Y_KeduStart.X,Y_KeduStart.Y,X_EndPoint.X,Y_KeduStart.Y);)else(gph.DrawString(Y_KeduArri-l.ToString(Yformat),new Font(uTimes NewRoman”,11),Brushes.Black,new PointF(Y_KeduStart.X-Yva
21、lueStrMoveleft,Y_KeduStart.Y-(i-1)*Y_KeduIncrement-6);gph.DrawLine(Pens.LightGray,Y_KeduStart.X,Y_KeduStart.Y-(i-1)*Y_KeduIncrement,X_EndPoint.X,Y_KeduStart.Y-(i-1)*Y_KeduIncrement);)/(90,440)x 轴第一根刻度线起点,(430,440)x 轴最后一根刻度线起点,(60,410)y 轴第一根刻度线起点,(60,70)y 轴最后一根刻度线起点为了方便画图,将原二维数据规格化到固定的画图区间(90-430,70-
22、410),规格化函数 F(x)=A*x+B因为窗口 丫轴坐标方向与正常坐标丫轴方向相反,故需要将丫坐标再变换一次,变换函数G(x)=C*x+D下面是X 坐标变换因子A,B,Y 坐标对应的变换因子A,B,C,Dfloat X_A=340.0f/X_Increment;float X_B=90.0f-(340.0f*X.smallestValue)/XJncrement;float Y_A=340.0f/Y_Increment;float Y_B=70.0f-(340.0f*Y_smallestValue)/Yncrement;float Y_C=-lf,Y_D=480f;for(int i=1;
23、i 1)gph.DrawLine(Pens.Red,Standard(X_arrayi-2,X_A,X_B,1,0),Standard(Y_arrayi-2,Y_A,Y_B,Y_C,Y_D),Standard(X_arrayi-1,X_A,X_B,1,0),Standard(Y_arrayi-1,Y_A,Y_B,Y_C,Y_D);)return bmap;保存输出图片static public Bitmap drawCurveOnImage(float X_array,float Y_array,string chartTitle,string X_title,string Y_title)(
24、CurvePaint CI=new CurvePaint();return CI.drawCurve(X_array,Y_array,chartTitle,X_title,Y_title);)static public Bitmap drawCurveOnImage(floatl X_array,floatf Y_array,string chartTitle,string X_title,string Y_title,int X_KeduCount,int Y_KeduCount)(CurvePaint CI=new CurvePaint();CLXkeduCount=X_KeduCount
25、;CI.YkeduCount=Y_KeduCount;return CLdrawCurve(X_array,Y_array,chartTitle,X_title,Y_title);)static public Bitmap drawCurveOnImage(float X_array,floatf Y_array,string chartTitle,string X_title,string Y_title,int X_KeduCount,int Y_KeduCount,float X_valueStrMoveleft,floatY_valueStrMoveleft,bool X_Direct
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 绘制 曲线图
限制150内