用C#绘制曲线图.docx

上传人:文*** 文档编号:68223298 上传时间:2022-12-27 格式:DOCX 页数:107 大小:1.69MB
返回 下载 相关 举报
用C#绘制曲线图.docx_第1页
第1页 / 共107页
用C#绘制曲线图.docx_第2页
第2页 / 共107页
点击查看更多>>
资源描述

《用C#绘制曲线图.docx》由会员分享,可在线阅读,更多相关《用C#绘制曲线图.docx(107页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、用C#绘制曲线图照例先上图:万曲线图比以前Coo!吧?呵呵,其实就是根据数据自动计算边距和字体等./自动根据参数调整图像大小/Public void Fit()计算字体距离intFontSpace=FontSize+5;计算图像边距Float fltSpace=Math.Min(Width/6, Height/6);XSpace=fltSpace;YSpace=fltSpace;计算X轴刻度宽度XSIice=(Width-2*XSpace)/(Keys.Length-1);计算Y轴刻度宽度和Y轴刻度开始值float fltMinValue=O;float fltMaxValue=O;for(i

2、nt i=O;iValues.Length;i+)(if(ValuesifltMaxValue)(fltMaxValue=Valuesi;)if(YSIiceBeginfltMinValue)(YSIiceBegin= fltMinValue;)ini intYSIiceCount=(int)(fltMaxValue/YSIiceValue);if(fltMaxValue%YSIiceValue!=O)(intYSIiceCount+;)YSIice=(Height-2*YSpace)/intYSIiceCount;)看我把数据缩小一个级别的效果:因为代码里面充斥了大量注释,也不敲太多文字了

3、.完整代码奉上:return 100;/Y轴刻度宽度/轴说明文字/setfltXRotateAngle=value;/自动根据参数调整图像大小接上文:ht/2);floatfltYI =Height-YSpace;floatfltX2=XSpace;floatfltY2=Height-YSpace;intiCount=0;intiSliceCount=1;floatScale=0;floatiWidth=(Width-2*XSpace)/XSIice)*50;将要画刻度的长度分段,并乘以 50,以10为单位画刻度线。floatfltSliceHeigE=XSIice/10; 刻度线的高度obj

4、Graphics.T ranslateT ransform(fltX1 ,fltY1); 平移图像(原点)objGraphics.RotateTransform(XRotateAngle,MatrixOrder.Prepend);/teffiobjGraphics.DrawString(Keys0.ToString(),newFont(5l,FontSize),newSolidBrush(SliceTextColor),0,0);objGraphics. ResetT ransform () /重置图像for(in=0;iv=iWidth;i+=10)以 10 为单位Scale=i*XSIic

5、e/50;/BP(i/10)*(XSIice/5),将每个刻度分五部分画,但因为 i以10为单位,得除以10if(iCount=5)objGraphics. DrawLine(newPen(newSolidBrush(AxisColor),fltX1 +ScobjGraphics.DrawCurve(CurvePen,CurvePointF,Tension);/初始化标题/privatevoidCreateTitle(refGraphicsobjGraphics)objGraphics.DrawString(Title,newFont(Mft,FontSize),newSolidBrush(T

6、extColor),newPoint(int)(Width-XSpace)-intFontSize*Title.Length,(int)(YSpace-YSIice/2-intFontSpace);个较能通用的c#画曲线类源码如下,思想以后面机会再说明:曲线类返回一个画好的图片曲线类源码开始using System;using System.Collections.Generic;using System.Text;using System.Drawing;namespace testPictureBoxpublic class CurvePaintpublic CurvePaint() 刻度

7、线条数private int _X_KeduCount=12;private int _Y_KeduCount=l 2;刻度值位置对应刻度线左移像素private float _X_valueStrMoveleft=5f;private float _Y_valueStrMoveleft=45f;格式化刻度值private string _X_Format 二#.;private string _Y_Formal = #0.00;x轴刻度值文字方向private bool _X_DirectionVertical = false;public int XkeduCount(get return

8、 _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

9、 = value;)public bool XdirectionVerticalget return _X_DirectionVertical; set _X_DirectionVertical = value;)public string Xformatget return _X_Format; set _X_Format = value; public string Yformatget return _Y_Format; set _Y_Format = value; 1private void setExtremeValues(float arr, ref float smallest

10、Value, ref float greatest Value) if(arr = null | arr.Length = 0) throw new Exception(用于绘曲线图的数组为空”); smallestValue = arr0;greatest Value = arr0;for (int i = 1; i arri) smallestValue = arri;if (greatest Value arri) greatest Value = arri;private void setKeduStringArray( float keduArr, float increment)f

11、or (int i = 1; i keduArr.Length; i+)keduArri = keduArri - 1 + increment;I/Z数据规格化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 bma

12、p = new Bitmap(500, 500);图片大小Graphics gph = Graphics.Fromlmage(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 轴终点(6

13、0,60)坐标轴三角形箭头PointF xpt = new PointF3 new PointF(X_EndPoint.X + 15, X_EndPoint.Y), new PointF(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), new PointF(Y_EndPoint.X - 4, Y_EndPoint.Y), new Poin

14、tF(Y_EndPoint.X + 4, Y_EndPoint.Y) ;/y 轴三角形画图表标题gph.DrawString(chartTitle, new Font(“宋体“,14), Brushes.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 SolidBrus

15、h(Color.Black), xpt);gph.DrawString(X_title, new Font(宋体,12), Brushes.Black, new PointF(X_EndPoint.X + 10, X_EndPoint.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

16、(Y_title, new Font(宋体,12), Brushes.Black, new PointF(0, Y_EndPoint.Y - 30);float X_smallestValue = Of, X_greatestValue = Of;float Y_smallestValue = Of, Y_greatestValue = Of;猎取横、纵坐标的最大最小值setExtremeValues(X_array, ref X_smallestValue, ref X_greatestValue);setExtremeValues(Y_array, ref Y_smallestValue,

17、 ref Y_greatestValue);增量=(最大值一最小值)float X_Increment = (X_greatestValue - X_smallestValue); float YJncrement = (Y_greatestValue - Y_smallestValue);平均增量=(最大值一最小值)/刻度间隔数,刻度间隔数=刻度线数一 1float X_AvgIncrement = X_Increment / (XkeduCount - 1);float Y_AvgIncrement = Y_Increment / (YkeduCount - 1);floatf X.Ked

18、uArr = new noatXkeduCount;/X 轴刻度值float Y_KeduArr = new floatYkeduCount;/Y 轴刻度值X_KeduArrO = X_smallestValue;Y_KeduArrO = Y_smal lest V al ue;给刻度值数组赋值setKeduStringArray(X_KeduArr, X_AvgIncrement);setKeduStringArray(Y_KeduArr, Y_AvgIncrement);刻度线起始位置PointF X_KeduStart = new PointF(cpt.X + 30, cpt.Y); /

19、(90,440) X 轴第一根刻度 线PointF XJKeduEnd = 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 PointF(Y_EndPoint.X, Y_EndPoint.Y + 10); /(60,70) y 轴最 后一根刻度线刻度线位置坐标平均增量float X_KeduIncrement = (X_Ked

20、uEnd.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.FormatFlags = StringFormatFlags. Direction V ertical;画X轴刻度线、刻度值for (int i = 1; i = Xked

21、uCount; i+) if(i = 1)(gph.DrawString(X_KeduArri - l.ToString(Xformat), new Font(Times New Roman, 11), Brushes.Black, new PointF(X_KeduStart.X - XvalueStrMoveleft, X_KeduStart.Y + 5), X_StringFormat);/ new StringFormat(StringFormatFlags.DirectionVertical);最后一个参数 实现文字竖排,默认为横排gph.DrawLine(Pens.LightGra

22、y, X_KeduStart.X, X_KeduStart.Y, X_KeduStart.X, Y_EndPoint.Y);elsegph.DrawString(X_KeduArri - l.ToString(Xformat), new FontCTimes New Roman, 11), Brushes.Black, new PointF(X_KeduStart.X + (i - 1) * X_KeduIncrement - XvalueStrMoveleft, cpt.Y + 5), X_StringFormat);/ new StringFormat(StringFormatFlags.

23、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(Times New Roma

24、n, 11), Brushes.Black, new PointF(Y_KeduStart.X - YvalueStrMoveleft, Y_KeduStart.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(Times New Roman, 11), Brushes.Black, new PointF(Y_KeduStart.

25、X - YvalueStrMoveleft, 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轴最后根刻度线起点为了方便画图,将

26、原二维数据规格化到固定的画图区间(90-430,70410),规格化函 数 F(x) = A * x + B因为窗口 丫轴坐标方向与正常坐标丫轴方向相反,故需要将丫坐标再变换一次, 变换函数G(x) = C*x + D下面是X坐标变换因子A,B, Y坐标对应的变换因子A,B,C,Dfloat X_A = 340.0f / Xncrement;float X_B = 90.0f-(340.0f * X_smallestValue) / Xncrement;float Y_A = 340.0f / Y_Increment;float Y_B = 70.0f - (340.0f * Y_smalle

27、stValue) / Yncrement;float Y_C = -lf, Y_D = 480f;for (int i = 1; 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 dr

28、awCurveOnImage(float X_array, float Y_array, string chartTitle, string X_title, string Y_title)(CurvePaint CI = new CurvePaint();return CI.drawCurve(X_array, Y_array, chartTitle, X_title, Y_title);1static public Bitmap drawCurveOnImage(float X_array, float Y_array, string chartTitle, string X_title,

29、 string Y_title,int X_KeduCount, int Y_KeduCount)(CurvePaint CI = new CurvePaint();Cl.XkeduCount = X_KeduCount;CLYkeduCount = Y_KeduCount;return CI.drawCurve(X_array, Y_array, chartTitle, X_title, Y_title);)static public Bitmap drawCurveOnImage(float X_array, float Y_array, string chartTitle, string

30、 X_title, string Y_title,int X_KeduCount, int Y_KeduCount, float X_valueStrMoveleft, float Y_valueStrMoveleft,bool X_DirectionVertical)(CurvePaint CI = new CurvePaint();Cl.XkeduCount = X_KeduCount;CLYkeduCount = Y_KeduCount;CI.XvalueStrMoveleft = X_valueStrMoveleft;CI. Y valueStrMoveleft = Y_valueSt

31、rMoveleft;CI._X_Direction Vertical = X_DirectionVertical;return CI.drawCurve(X_array, Y_array, chartTitle, X_title, Y_title);)曲线类源码结束测试工程源码开始using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;n

32、amespace testPictureBox(public partial class Forml : Form(public Form 1 ()(InitializeComponent();private void picBox_Paint(object sender, PaintEventArgs e)(float month = new floatfl2;for (int i = 0; i 12; i+)monthi = i+l;float d = new float12 20.5f, 60, 10.8f, 15.6f, 30, 70.9f, 50.3f, 30.7f, 70, 50.

33、4f, 30.8f, 20);picBox.SizeMode = PictureBoxSizeMode.Zoom;CurvePaint cp = new CurvePaint();cp.XkeduCount = 10;cp.YkeduCount = 10;cp.XvalueStrMoveleft = 15;picBox.Image = cp.drawCurve(month, d,某工厂某产品月生产量图表”,“月份”,“产量测试工程源码结束这里的测试工程在VS2005下,新建一个windows窗口工程testPictureBox,拖 入个picturebox控件,命名为picBox。在picBo

34、x的paint事件中调用曲线 类得到画好的曲线图片,将该图片载入picturebox即可。C#制作曲线图源码using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Imaging;namespace RealtimeCurve (/ /Z说明:实时图片生成类,在本例中横向坐标上每个像素都会有一个控制点/Z实际开发中可以减少控制点,比如每5个像素用一个控制点/Z这样的效果或许更加逼真/Z作者:周公/ 日期:2008-07-21/Z首发地址:A

35、href=ufoxcn/archive/2008/07/21/2682027.aspx/ public class RealTimelmageMaker (private int width;要生成的曲线图的宽度private int height;耍生成的曲线图的高度private Point pointList;/用来绘制曲线图的关键点,依次将这些点连接起来即得到 曲线图private Random random = new Random。;/用于生成随机数private Bitmap currentimage;/当前要绘制的图片private Color backColor;图片背景色p

36、rivate Color foreColor;图片前景色/ /Z图片的高度/ public int Height (get return height; set height = value; )/ /Z图片的宽度/ public int Width get return width; set width = value; / /Z构造函数,指定生成的曲线图的宽度和高度/SUMMARY/ 要生成的曲线图的宽度v/PARAM/ publicRealTimeImageMaker( intwidth,intheight):this(width,height,Color.Gray,Color.Blue

37、)SUMMARY/Z构造函数,指定生成的曲线图的宽度、高度及背景色和前景色/SUMMARY/PARAM name二”width”要生成的曲线图的宽度/PARAM/PARAM name二”heigh”要生成的曲线图的高度/PARAM/ PARAM name二”backColor”曲线图背景色/PARAM/ PARAM name二”foreColor”曲线图前景色/PARAMpublic RealTimeImageMaker(int width, int height, Color backColor, Color foreColor)this.width 二 width;this.height

38、= height;this.backColor 二 backColor;this.foreColor = fbreColor; pointList 二 new Pointfwidth; Point tempPoint;初始化曲线上的所有点坐标for (int i = 0; i width; i+) tempPoint = new Point();曲线的横坐标沿X轴依次递增,在横向位置上每个像素都有一个点 tempPoint.X = i;曲线上每个点的纵坐标随机生成,但保证在显示区域之内tempPoint. Y = random.Next() % height;pointListi = temp

39、Point;)/ /Z获取当前依次连接曲线上每个点绘制成的曲线/ / public Image GetCurrentCurve()/currentimage = historyImage.CIone(new Rectangle( 1, 0, width - 1, height), PixelFormat.Format24bppRgb);currentimage = new Bitmap(width, height);Point p;将当前定位曲线图的坐标点前移,并且将横坐标减1,这样做的效果相当于移除当前第一个点for (int i = 0; i width-1; i+)(p = pointL

40、isti + 1;pointListi = new Point(p.X-l,p.Y);)Point tempPoint = new Point();新生成曲线图定位点的最后个点的坐标tempPoint.X = width;曲线上每个点的纵坐标随机生成,但保证在显示区域之内 tempPoint.Y = random.Next(DateTime.Now.Millisecond) % height;在最后再添加一个新坐标点pointListwidth-l =tempPoint;Graphics g = Graphics.Fromlmage(currentlmage);g.Clear(backColo

41、r);绘制曲线图g.DrawLines(new Pen(fbreColor), pointList);g.Dispose();return currentimage;using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Drawing.Imaging;namespace RealtimeCurve (/III说明:实时图片生成类,在本例中横向坐标上每个像素都会有一个控制点/Z实际开发中可以减少控制点,比如每5个像素用个控制点/Z这样的效果或许更加逼真作者:周公III 日期:2008-07-21III 首发地址:IIIpublic class RealTimelmageMaker private int width;要生成的曲线图的宽度private int height;要生成的曲线图的高度private Point pointList;用来绘制曲线图的关键点,依次将这些点连接起来即得到 曲线图private Random random = new Random。;/用于生成随机数priv

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com