




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
用C#繪制曲線圖照例先上圖:萬曲線圖萬曲線圖比以前Coo!吧?呵呵,其實就是根據數據自動計算邊距和字體等.///<summary>〃/自動根據參數調整圖像大小///</summary>PublicvoidFit()〃計算字體距離intFontSpace=FontSize+5;〃計算圖像邊距FloatfltSpace=Math.Min(Width/6,Height/6);XSpace=fltSpace;YSpace=fltSpace;〃計算X軸刻度寬度XSIice=(Width-2*XSpace)/(Keys.Length-1);〃計算Y軸刻度寬度和Y軸刻度開始值floatfltMinValue=O;floatfltMaxValue=O;for(inti=O;i<Values.Length;i++)(if(Values[i]<fltMinValue)(fltMinValue=Values[i];)elseif(Values[i]>fltMaxValue)(fltMaxValue=Values[i];)}if(YSIiceBegin>fltMinValue)(YSIiceBegin=fltMinValue;)iniintYSIiceCount=(int)(fltMaxValue/YSIiceValue);if(fltMaxValue%YSIiceValue!=O)(intYSIiceCount++;)YSIice=(Height-2*YSpace)/intYSIiceCount;)看我把數據縮小一個級別的效果:因為代碼里面充斥了大量注釋,也不敲太多文字了..完整代碼奉上:
return100;
///Y軸刻度寬度///<summary>〃"軸說明文字///<summary>
set{fltXRotateAngle=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;〃刻度線的高度objGraphics.TranslateTransform(fltX1,fltY1);〃平移圖像(原點)objGraphics.RotateTransform(XRotateAngle,MatrixOrder.Prepend);//te^ffiobjGraphics.DrawString(Keys[0].ToString(),newFont("5l<^",FontSize),newSolidBrush(SliceTextColor),0,0);objGraphics.ResetTransform()ノ/重置圖像for(inゼ=0;iv=iWidth;i+=10)〃以10為單位Scale=i*XSIice/50;//BP(i/10)*(XSIice/5),將每個刻度分五部分畫,但因為i以10為單位,得除以10if(iCount==5)objGraphics.DrawLine(newPen(newSolidBrush(AxisColor)),fltX1+Sc
objGraphics.DrawCurve(CurvePen,CurvePointF,Tension);///<summary>〃/初始化標題///</summary>///<paramname=',objGraphics,,x/param>privatevoidCreateTitle(refGraphicsobjGraphics)objGraphics.DrawString(Title,newFont(M^ft",FontSize),newSolidBrush(TextColor),newPoint((int)(Width-XSpace)-intFontSize*Title.Length,(int)(YSpace-YSIice/2-intFontSpace)));ー個較能通用的c#畫曲線類源碼如下,思想以后面機會再說明:曲線類返回一個畫好的圖片曲線類源碼開始 usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Drawing;namespacetestPictureBoxpublicclassCurvePaintpublicCurvePaint(){}〃刻度線條數privateint_X_KeduCount=12;privateint_Y_KeduCount=l2;〃刻度值位置對應刻度線左移像素privatefloat_X_valueStrMoveleft=5f;privatefloat_Y_valueStrMoveleft=45f;〃格式化刻度值privatestring_X_Format二"#〇.〇";privatestring_Y_Formal="#0.00";〃x軸刻度值文字方向privatebool_X_DirectionVertical=false;publicintXkeduCount(get{return_X_KeduCount;}set(_X_KeduCount=value;)}publicintYkeduCount(get{return_Y_KeduCount;}set{_Y_KeduCount=value;}}publicfloatXvalueStrMoveleft(get{return_X_valueStrMoveleft;|set{_X_valueStrMoveleft=value;})publicfloatYvalueStrMoveleft(get{return_Y_valueStrMoveleft;}set{_Y_valueStrMoveleft=value;)publicboolXdirectionVerticalget{return_X_DirectionVertical;}set{_X_DirectionVertical=value;)}publicstringXformat{get{return_X_Format;}set{_X_Format=value;}}publicstringYformat{get{return_Y_Format;}set{_Y_Format=value;}1privatevoidsetExtremeValues(float[]arr,reffloatsmallestValue,reffloatgreatestValue){if(arr==null||arr.Length==0)thrownewException("用于繪曲線圖的數組為空”);smallestValue=arr[0];greatestValue=arr[0];for(inti=1;i<arr.Length;i++){if(smallestValue>arr[i])smallestValue=arr[i];if(greatestValue<arr[i])greatestValue=arr[i];privatevoidsetKeduStringArray(float[]keduArr,floatincrement){for(inti=1;i<keduArr.Length;i++){keduArr[i]=keduArr[i-1]+increment;}I/Z數據規格化f(x)=ax+bprivatefloatStandard(floatx,floatA,floatB,floatC,floatD){returnC*(A*x+B)+D;}publicBitmapdrawCurve(float[]X_array,float[]Y_array,stringchartTitle,stringX_title,stringY_title)〃畫圖初始化Bitmapbmap=newBitmap(500,500);〃圖片大小Graphicsgph=Graphics.Fromlmage(bmap);gph.Clear(Color.White);〃曲線圖左、下、右、上的空隙均為60像素PointFcpt=newPointF(60f,bmap.Height-60f);〃坐標原點,坐標軸起始點(60,440)PointFX.EndPoint=newPointF(bmap.Width-60f,cpt.Y);//X軸終點(440,440)PointFY.EndPoint=newPointF(cpt.X,60f);//Y軸終點(60,60)〃坐標軸三角形箭頭PointF[]xpt=newPointF[3]{newPointF(X_EndPoint.X+15,X_EndPoint.Y),newPointF(X_EndPoint.X,X_EndPoint.Y-4),newPointF(X_EndPoint.X,X.EndPoint.Y+4)};//x軸三角形PointF[]ypt=newPointF[3]{newPointF(Y_EndPoint.X,Y_EndPoint.Y-15),newPointF(Y_EndPoint.X-4,Y_EndPoint.Y),newPointF(Y_EndPoint.X+4,Y_EndPoint.Y)};//y軸三角形〃畫圖表標題gph.DrawString(chartTitle,newFont(“宋體“,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(newSolidBrush(Color.Black),xpt);gph.DrawString(X_title,newFont("宋體",12),Brushes.Black,newPointF(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(newSolidBrush(Color.Black),ypt);gph.DrawString(Y_title,newFont("宋體",12),Brushes.Black,newPointF(0,Y_EndPoint.Y-30));floatX_smallestValue=Of,X_greatestValue=Of;floatY_smallestValue=Of,Y_greatestValue=Of;〃獵取橫、縱坐標的最大最小值setExtremeValues(X_array,refX_smallestValue,refX_greatestValue);setExtremeValues(Y_array,refY_smallestValue,refY_greatestValue);〃增量=(最大值一最小值)floatX_Increment=(X_greatestValue-X_smallestValue);floatYJncrement=(Y_greatestValue-Y_smallestValue);〃平均增量=(最大值一最小值)/刻度間隔數,刻度間隔數=刻度線數一1floatX_AvgIncrement=X_Increment/(XkeduCount-1);floatY_AvgIncrement=Y_Increment/(YkeduCount-1);floatf]X.KeduArr=newnoat[XkeduCount];//X軸刻度值float[]Y_KeduArr=newfloat[YkeduCount];//Y軸刻度值X_KeduArr[O]=X_smallestValue;Y_KeduArr[O]=Y_smallestValue;〃給刻度值數組賦值setKeduStringArray(X_KeduArr,X_AvgIncrement);setKeduStringArray(Y_KeduArr,Y_AvgIncrement);〃刻度線起始位置PointFX_KeduStart=newPointF(cpt.X+30,cpt.Y);//(90,440)X軸第一根刻度線PointFXJKeduEnd=newPointF(X_EndPoint.X-10,X_EndPoint.Y);//(430,440)x軸最后一根刻度線PointFY_KeduStart=newPointF(cpt.X,cpt.Y-30); //(60,410)y軸第一根刻度線PointFY_KeduEnd=newPointF(Y_EndPoint.X,Y_EndPoint.Y+10);//(60,70)y軸最后一根刻度線〃刻度線位置坐標平均增量floatX_KeduIncrement=(X_KeduEnd.X-X_KeduStart.X)/(XkeduCount-1);floatY_KeduIncrement=(Y_KeduStart.Y-Y_KeduEnd.Y)/(YkeduCount-1);〃設置X軸刻度值顯示方向StringFormatX_StringFormat=newStringFormat();if(XdirectionVertical){X__StringFormat.FormatFlags=StringFormatFlags.DirectionVertical;}〃畫X軸刻度線、刻度值for(inti=1;i<=XkeduCount;i++){if(i==1)(gph.DrawString(X_KeduArr[i-l].ToString(Xformat),newFont("TimesNewRoman",11),Brushes.Black,newPointF(X_KeduStart.X-XvalueStrMoveleft,X_KeduStart.Y+5),X_StringFormat);//newStringFormat(StringFormatFlags.DirectionVertical));〃最后一個參數實現文字豎排,默認為橫排gph.DrawLine(Pens.LightGray,X_KeduStart.X,X_KeduStart.Y,X_KeduStart.X,Y_EndPoint.Y);elsegph.DrawString(X_KeduArr[i-l].ToString(Xformat),newFontCTimesNewRoman",11),Brushes.Black,newPointF(X_KeduStart.X+(i-1)*X_KeduIncrement-XvalueStrMoveleft,cpt.Y+5),X_StringFormat);//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(inti=1;i<=YkeduCount;i++)(if(i==1)(gph.DrawString(Y_KeduArr[i-l].ToString(Yformat),newFont("TimesNewRoman",11),Brushes.Black,newPointF(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_KeduArr[i-l].ToString(Yformat),newFont("TimesNewRoman",11),Brushes.Black,newPointF(Y_KeduStart.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軸最后ー根刻度線起點〃為了方便畫圖,將原二維數據規格化到固定的畫圖區間(90-430,70—410),規格化函數F(x)=A*x+B〃因為窗口丫軸坐標方向與正常坐標丫軸方向相反,故需要將丫坐標再變換一次,變換函數G(x)=C*x+D〃下面是X坐標變換因子A,B,Y坐標對應的變換因子A,B,C,DfloatX_A=340.0f/X」ncrement;floatX_B=90.0f-(340.0f*X_smallestValue)/X」ncrement;floatY_A=340.0f/Y_Increment;floatY_B=70.0f-(340.0f*Y_smallestValue)/Y」ncrement;floatY_C=-lf,Y_D=480f;for(inti=1;i<=Y_array.Length;i++)(〃畫點gph.DrawEHipse(Pens.Black,Standard(X_array[i-1],X_A,X_B,1,0)-1.5f,Standard(Y_array[i-1],Y_A,Y_B,Y_C,Y_D)-1.5f,3,3);gph.FillEllipse(newSolidBrush(Color.Black),Standard(X_array[i-1],X_A,X_B,1,0)-1.5f,Standard(Y_array[i-1],Y_A,Y_B,Y_C,Y_D)-1.5f,3,3);〃畫數值gph.DrawString(Y_array[i-l].ToString(),newFontC'TimesNewRoman",11),Brushes.Black,newPointF(Standard(X_array[i-1],X_A,X_B,1,0),Standard(Y_array[i-1],Y_A,Y_B,Y_C,Y_D)));〃畫折線if(i>1)gph.DrawLine(Pens.Red,Standard(X_array[i-2],X_A,X_B,1,0),Standard(Y_array[i-2],Y_A,Y_B,Y_C,Y_D),Standard(X_array[i-1],X_A,X_B,1,0),Standard(Y_array[i-1],Y_A,Y_B,Y_C,Y_D));}returnbmap;〃保存輸出圖片}staticpublicBitmapdrawCurveOnImage(float[]X_array,float[]Y_array,stringchartTitle,stringX_title,stringY_title)(CurvePaintCI=newCurvePaint();returnCI.drawCurve(X_array,Y_array,chartTitle,X_title,Y_title);1staticpublicBitmapdrawCurveOnImage(float[]X_array,float[]Y_array,stringchartTitle,stringX_title,stringY_title,intX_KeduCount,intY_KeduCount)(CurvePaintCI=newCurvePaint();Cl.XkeduCount=X_KeduCount;CLYkeduCount=Y_KeduCount;returnCI.drawCurve(X_array,Y_array,chartTitle,X_title,Y_title);)staticpublicBitmapdrawCurveOnImage(float[]X_array,float[]Y_array,stringchartTitle,stringX_title,stringY_title,intX_KeduCount,intY_KeduCount,floatX_valueStrMoveleft,floatY_valueStrMoveleft,boolX_DirectionVertical)(CurvePaintCI=newCurvePaint();Cl.XkeduCount=X_KeduCount;CLYkeduCount=Y_KeduCount;CI.XvalueStrMoveleft=X_valueStrMoveleft;CI.YvalueStrMoveleft=Y_valueStrMoveleft;CI._X_DirectionVertical=X_DirectionVertical;returnCI.drawCurve(X_array,Y_array,chartTitle,X_title,Y_title);}))曲線類源碼結束 測試工程源碼開始 usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespacetestPictureBox(publicpartialclassForml:Form(publicForm1()(InitializeComponent();}privatevoidpicBox_Paint(objectsender,PaintEventArgse)(float[]month=newfloatfl2];for(inti=0;i<12;i++){month[i]=i+l;}floatロd=newfloat[12]{20.5f,60,10.8f,15.6f,30,70.9f,50.3f,30.7f,70,50.4f,30.8f,20);picBox.SizeMode=PictureBoxSizeMode.Zoom;CurvePaintcp=newCurvePaint();cp.XkeduCount=10;cp.YkeduCount=10;cp.XvalueStrMoveleft=15;picBox.Image=cp.drawCurve(month,d,"某工廠某產品月生產量圖表”,“月份”,“產量測試工程源碼結束這里的測試工程在VS2005下,新建一個windows窗口工程testPictureBox,拖入ー個picturebox控件,命名為picBox。在picBox的paint事件中調用曲線類得到畫好的曲線圖片,將該圖片載入picturebox即可。C#制作曲線圖源碼usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Drawing;usingSystem.Drawing.Imaging;namespaceRealtimeCurve(///<SUMMARY>//Z說明:實時圖片生成類,在本例中橫向坐標上每個像素都會有一個控制點//Z實際開發中可以減少控制點,比如每5個像素用一個控制點//Z這樣的效果或許更加逼真//Z作者:周公///日期:2008-07-21//Z 首 發 地 址: <Ahref="/zhoufoxcn/archive/2008/07/21/2682027.aspx">/zhoufoxcn/archive/2008/07/21/2682027.aspx</A>///</SUMMARY>publicclassRealTimelmageMaker(privateintwidth;〃要生成的曲線圖的寬度privateintheight;〃耍生成的曲線圖的高度privatePoint[]pointList;//用來繪制曲線圖的關鍵點,依次將這些點連接起來即得到曲線圖privateRandomrandom=newRandom。;//用于生成隨機數privateBitmapcurrentimage;//當前要繪制的圖片privateColorbackColor;〃圖片背景色privateColorforeColor;〃圖片前景色///<SUMMARY>//Z圖片的高度///</SUMMARY>publicintHeight(get{returnheight;}set{height=value;})///<SUMMARY>//Z圖片的寬度///</SUMMARY>publicintWidth{get{returnwidth;}set{width=value;}}///<SUMMARY>//Z構造函數,指定生成的曲線圖的寬度和高度〃ノ〈/SUMMARY〉///<PARAMnameゴwidth”>要生成的曲線圖的寬度v/PARAM>///<PARAMname="height”〉要生成的曲線圖的高度v/PARAM>public RealTimeImageMaker(int width, intheight):this(width,height,Color.Gray,Color.Blue)〃ノ〈SUMMARY〉//Z構造函數,指定生成的曲線圖的寬度、高度及背景色和前景色///〈/SUMMARY〉///<PARAMname二”width”〉要生成的曲線圖的寬度〈/PARAM〉///<PARAMname二”heigh”〉要生成的曲線圖的高度〈/PARAM〉///<PARAMname二”backColor”〉曲線圖背景色〈/PARAM〉///<PARAMname二”foreColor”〉曲線圖前景色〈/PARAM〉publicRealTimeImageMaker(intwidth,intheight,ColorbackColor,ColorforeColor)this.width二width;this.height=height;this.backColor二backColor;this.foreColor=fbreColor;pointList二newPointfwidth];PointtempPoint;〃初始化曲線上的所有點坐標for(inti=0;i<width;i++){tempPoint=newPoint();〃曲線的橫坐標沿X軸依次遞增,在橫向位置上每個像素都有一個點tempPoint.X=i;〃曲線上每個點的縱坐標隨機生成,但保證在顯示區域之內tempPoint.Y=random.Next()%height;pointList[i]=tempPoint;})///<SUMMARY>//Z獲取當前依次連接曲線上每個點繪制成的曲線///</SUMMARY>///<RETURNS></RETURNS>publicImageGetCurrentCurve(){//currentimage=historyImage.CIone(newRectangle(1,0,width-1,height),PixelFormat.Format24bppRgb);currentimage=newBitmap(width,height);Pointp;〃將當前定位曲線圖的坐標點前移,并且將橫坐標減1,〃這樣做的效果相當于移除當前第一個點for(inti=0;i<width-1;i++)(p=pointList[i+1];pointList[i]=newPoint(p.X-l,p.Y);)PointtempPoint=newPoint();〃新生成曲線圖定位點的最后ー個點的坐標tempPoint.X=width;〃曲線上每個點的縱坐標隨機生成,但保證在顯示區域之內tempPoint.Y=random.Next(DateTime.Now.Millisecond)%height;〃在最后再添加一個新坐標點pointList[width-l]=tempPoint;Graphicsg=Graphics.Fromlmage(currentlmage);g.Clear(backColor);〃繪制曲線圖g.DrawLines(newPen(fbreColor),pointList);g.Dispose();returncurrentimage;usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Drawing;usingSystem.Drawing.Imaging;namespaceRealtimeCurve(///III說明:實時圖片生成類,在本例中橫向坐標上每個像素都會有一個控制點//Z實際開發中可以減少控制點,比如每5個像素用ー個控制點//Z這樣的效果或許更加逼真〃ノ作者:周公III日期:2008-07-21III首發地址:/zhoufoxcn/archive/2008/07/21/2682027.aspxIIIpublicclassRealTimelmageMaker{privateintwidth;〃要生成的曲線圖的寬度privateintheight;〃要生成的曲線圖的高度privatePoint[]pointList;〃用來繪制曲線圖的關鍵點,依次將這些點連接起來即得到曲線圖privateRandomrandom=newRandom。;//用于生成隨機數privateBitmapcurrentimageソ/當前要繪制的圖片privateColorbackColor;〃圖片背景色privateColorforeColor;//圖片前景色/////Z圖片的高度///publicintHeight(get{returnheight;}set{height=value;}}/////Z圖片的寬度///publicintWidthget{returnwidth;}set{width=value;})/////Z構造函數,指定生成的曲線圖的寬度和高度III///要生成的曲線圖的寬度///要生成的曲線圖的高度public RealTimeImageMaker(int width, intheight):this(width,height,Color.Gray,Color.Blue){)III//Z構造函數,指定生成的曲線圖的寬度、高度及背景色和前景色//////要生成的曲線圖的寬度///要生成的曲線圖的高度//Z曲線圖背景色//Z曲線圖前景色publicRealTimeImageMaker(intwidth,intheight,ColorbackColor,ColorfbreColor){this.width=width;this.height=height;this.backColor=backColor;this.fbreColor=fbreColor;pointList=newPoint[width];PointtempPoint;〃初始化曲線上的所有點坐標for(inti=0;i<width;i++){tempPoint=newPoint();〃曲線的橫坐標沿X軸依次遞增,在橫向位置上每個像素都有一個點tempPoint.X=i;〃曲線上每個點的縱坐標隨機生成,但保證在顯示區域之內tempPoint.Y=random.Next()%height;pointList[i]=tempPoint;)}IIIII!獲取當前依次連接曲線上每個點繪制成的曲線//////publicImageGetCurrentCurve(){//currentimage=historyImage.Clone(newRectangle(1,0,width-1,height),PixelFormat.Format24bppRgb);currentimage=newBitmap(width,height);Pointp;〃將當前定位曲線圖的坐標點前移,并且將橫坐標減1,〃這樣做的效果相當于移除當前第一個點for(inti=0;i<width-1;i++){p=pointList[i+1];pointList[i]=newPoint(p.X-l,p.Y);)PointtempPoint=newPoint();〃新生成曲線圖定位點的最后ー個點的坐標tempPoint.X=width;〃曲線上每個點的縱坐標隨機生成,但保證在顯示區域之內tempPoint.Y=random.Next(DateTime.Now.Millisecond)%height;〃在最后再添加一個新坐標點pointList[width-1]=tempPoint;Graphicsg=Graphics.Fromlmage(currentlmage);g.Clear(backColor);〃繪制曲線圖g.DrawLines(newPen(foreColor),pointList);g.Dispose();returncurrentimage;))}窗體關鍵代碼:viewplaincopytoclipboardprint?usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Threading;namespaceRealtimeCurve(///<SUMMARY>//Z說明:顯示實時曲線圖的窗體//Z作者:周公///日期:2008-07-21//Z 首 發 地 址: <Ahref="/zhoufoxcn/archive/2008/07/21/2682027.aspx">/zhoufoxcn/archive/2008/07/21/2682027.aspx</A>III</SUMMARY>publicpartialclassFormRealTime:Form(Threadthread;RealTimelmageMakerrti;ColorbackColor=Color.Black;//指定繪制曲線圖的背景色publicFormRealTimeO(InitializeComponent();rti=newRealTimeImageMaker(Width,Height,backColor,Color.Green);thread=newThread(newThreadStart(Run));thread.Start();)privatevoidRun(){while(true){Imageimage=rti.GetCurrentCurve();Graphicsg=CreateGraphics();〃用指定背景色清除當前窗體上的圖象g.Clear(backColor);.DrawImage(image,0,0);g.Dispose();〃每秒鐘刷新ー次Thread.Sleep(lOOO);))privatevoidFormRealTime_FormClosing(objectsender,FormClosingEventArgse)〃在窗體即將關閉之前中止線程thread.Abort();c#繪制圓柱和曲線在我們程序開發的過程中經常會需要繪制曲線圖和柱狀圖等,尤其是在做統計功能時。但是有時候我們有覺得沒有必要使用第三方控件(例如:ZedGraph等),這是我們可以自己編寫代碼來實現這些圖形繪制的功能。以下是我在開發過程中所使用過的兩段代碼,現共享大家,希望能給大家帶來一定的幫助,如有不妥敬請斧正!.柱狀圖,效果圖如下統計〔統計〔藍?凈費〕〔紅:交需〕08-10-01 08-10-21 08-11-10 08-11-30 08-12-20代碼如下:注意:請注意參數chartTable圖形里的ー些元素需要從chartTable里面取。具體請查看代碼。//Render是圖形大標題,圖開小標題,圖形寬度,圖形長度,餅圖的數據集和餅圖的數據集publicImageRender(stringtitle,intwidth,intheight,DataTablechartTable)(Bitmapbm=newBitmap(width,height);Graphicsg=Graphics.Fromlmage(bm);g.Clear(Color.White);DataTabledt=chartTable;constinttop=30;constintleft=35;if(width<left*2||height<top*2)g.DrawString("繪圖區域太小",newFont("Tahoma",8),
Brushes.Blue,newPointF(0,0));returnbm;}〃計算最髙的點floathighPoint=1;fbreach(DataRowdrindt.Rows)(if(highPoint<Convert.ToSingle(dr[0]))(highPoint=Convert.ToSingie(dr[0]);)if(highPoint<Convert.ToSingle(dr[1]))(highPoint=Convert.ToSingle(dr[1]);))try(〃畫大標題g.DrawString(title,newFont("Tahoma",12),Brushes.Black,newPointF(2,2));StringFormatdrawFormat=newStringFormat();drawFormat.FormatFlags=StringFormatFlags.DirectionVertical;g.DrawString("[紅+dt.Columns[0].ToString()+newFont("Tahoma",8),Brushes.Red,newPointF(2,top),drawFormat);g.DrawString(“藍ー"+dt.Columns[1].ToString()+ッ”,newFont("Tahoma”,8),Brushes.Blue,newPointF(17,top),drawFormat);〃畫條形圖floatbarWidth=(Convert.ToSingle(width)-left)/(dt.Rows.Count*3+1);PointFbarOrigin=newPointF(left+barWidth,0);floatbarHeight=dt.Rows.Count;floattopFontSize二(barWidth/highPoint.ToString().Length);if(topFontSize>2*top/3)(topFontSize=2*top/3;if(topFontSize<5)topFontSize=5;for(inti=0;i<dt.Rows.Count;i++)(〃底部字體的大小floatbottomFontSize=(2*barWidth/dt.Rows[i][2].ToString().Length)+2;if(bottomFontSize>2*top/3)(bottomFontSize=2*top/3;)barHeight=Convert.ToSingle(dt.Rows[i][0])*(height-2*top)/highPoint*1;barOrigin.Y=height-barHeight-top;g.FillRectangle(newSolidBrush(Color.Red),barOrigin.X,barOrigin.Y,barWidth,barHeight);〃柱狀圖底部g.DrawString(dt.Rows[i][2].ToString(),newFont("Tahoma",bottomFontSize),Brushes.Black,newPointF(barOrigin.X,height-top));〃柱狀圖頂部g.DrawString(dt.Rows[i][0].ToString(),newFont("Tahoma",topFontSize),Brushes.Red,newPointF(barOrigin.X,barOrigin.Y-3*topFontSize/2));barOrigin.X=barOrigin.X+barWidth;barHeight=Convert.ToSingle(dt.Rows[i][l])*(height-2*top)/highPoint*1;barOrigin.Y=height-barHeight-top;g.FillRectangle(newSolidBrush(Color.Blue),barOrigin.X,barOrigin.Y,barWidth,barHeight);〃柱狀圖頂部g.DrawString(dt.Rows[i][l].ToString(),newFont("Tahoma",topFontSize),Brushes.Blue,newPointF(barOrigin.X,barOrigin.Y-3*topFontSize/2));barOrigin.X=barOrigin.X+(barWidth*2);//設置邊g.DrawLine(newPen(Color.Blue,2),newPoint(left,top),newPoint(left,height-top));g.DrawLine(newPen(Color.Blue,2),newPoint(left,height-top),newPoint(left+width,height-top));g.Dispose();returnbm;)catch{returnbm;).線狀圖,效果如下:軍浄父」軍浄父」〔紅:交需〕代碼如下:注意:請注意參數chartTable圖形里的ー些元素需要從chartTable里面取。具體請查看代碼。//Render是圖形大標題,圖開小標題,圖形寬度,圖形長度,餅圖的數據集和餅圖的數據集publicImageRender(stringtitle,intwidth,intheight,DataTablechartTable){Bitmapbm=newBitmap(width,height);Graphicsg=Graphics.Fromlmage(bm);g.Clear(Color.White);constinttop=30;constintleft=35;if(width<left*2||height<top*2)
g.DrawString("繪圖區域太小”,newFont("Tahoma",8),Brushes.Blue,newPointF(0,0));returnbm;)if(chartTable==null)(g.DrawString("沒有數據",newFont("Tahoma",7),Brushes.Blue,newPointF(0,0));returnbm;)DataTabledt=chartTable;〃計算最高的點floathighPoint=1;foreach(DataRowdrindt.Rows){if(highPoint<Convert.ToSingle(dr[0])){highPoint=Convert.ToSingle(dr[0]);1if(highPoint<Convert.ToSingle(dr|1]))(highPoint=Convert.ToSingle(dr[1]);)}〃建立一個Graphics對象實例try{〃畫大標題g.DrawString(title,newFont("Tahoma",12),Brushes.Black,newPointF(2,2));StringFormatdrawFormat=newStringFormat();drawFormat.FormatFlags=StringFormatFlags.DirectionVertical;g.DrawString("[紅ー-"+dt.Columns[0].ToString()+"]",newFont("Tahoma",8),Brushes.Red,newPointF(2,top),drawFormat);g.DrawString("[藍ー"+dt.Columns[1].ToString()+"]",newFont("Tahoma",8),
Brushes.Blue,newPointF(17,top),drawFormat);〃畫條形圖floatbarWidth=(Convert.ToSingle(width)-left)/(dt.Rows.Count+1);PointFbarOrigin=newPointF(left+barWidth,0);floatbarHeight=dt.Rows.Count;floattopFontSize=7;floatbottomFontSize=7;PointF[]ptl=newPointF[dt.Rows.Count];PointF[]pt2=newPointF[dt.Rows.Count];for(inti=0;i<dt.Rows.Count;i++)(〃底部字體的大小barHeight=Convert.ToSingle(dt.Rows[i][0])*(height-2*top)/highPoint*1;barOrigin.Y=height-barHeight-top;g.FillEllipse(newSolidBrush(Color.Red),barOrigin.X-3,barOrigin.Y-3,6,6);ptl[i]=newPointF(barOrigin.X,barOrigin.Y);〃頂部g.DrawString(dt.Rows[i][0].ToString(), new Font(',TahomaM,topFontSize),Brushes.Red,newPointF(barOrigin.X,barOrigin.Y-4*topFontSize/2));barHeight=Convert.ToSingle(dt.Rows[i][1])*(height-2*top)/highPoint*1;barOrigin.Y=height-barHeight-top;g.FillEllipse(newSolidBrush(Color.Blue),barOrigin.X-3,barOrigin.Y-3,6,6);pt2[i]=newPointF(barOrigin.X,barOrigin.Y);〃頂部g.DrawString(dt.Rows[i][l].ToString(), new Font("Tahoma”,topFontSize),Brushes.Blue,newPointF(barOrigin.X,barOrigin.Y-4*topFontSize/2));barOrigin.X=barOrigin.X+barWidth;)if(dt.Rows.Count>10)(intdis=dt.Rows.Count/10;fbr(inti=0;i<dt.Rows.Count;i++)if(i%dis==0)g.DrawLine(newPen(Color.Blue,2),newPointF(left+(i+1)*barWidth,height-top+5),newPointF(left+(i+1)*barWidth,height-top-3));〃底部g.DrawString(dt.Rows[i][2].ToString(),newFont("Tahoma",bottomFontSize),Brushes.Black,newPointF(left+(i+1)*barWidth,height-top));)else(g.DrawLine(newPen(Color.Gray,1),newPointF(left+(i+1)*barWidth,height-top+3),newPointF(left+(i+1)*barWidth,height?top-3));))1else(for(inti=0;i<dt.Rows.Count;i++)(g.DrawLine(newPen(Color.Gray,1),newPointF(left+(i+1)*barWidth,height-top+3),newPointF(left+(i+1)*barWidth,height-top-3));))〃繪制曲線g.DrawLines(newPen(newSolidBrush(Color.Red),1),ptl);g.DrawLines(newPen(newSolidBrush(Color.Blue),1),pt2);〃設置邊g.DrawLine(newPen(Color.Blue,2),newPoint(left,top),newPoint(left,height-top));g.DrawLine(newPen(Color.Blue,2),newPoint(left,height-top),newPoint(left+width,height-top));g.Dispose();returnbm;)catch{returnbm;))<type=text/JavaScript>alimama_pid="mm_10249644_1605763_4930558u;alimama_type=;alimama_sizecode=ntl_lx5_8M;alimama_fbntsize=12; alimama_bordercolor=nFFFFFF1';alimama_bgcolor=,'FFFFFF,';alimama_titlecolor=',0000FFM;alimama_underline=O;alimama_height=22;alimama_width=512;<src=,'/inf.js,'type=text/javascript>c#曲線圖usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Drawing;usingSystem.Windows.Forms;namespaceDeviceApplication2(classcurve_line:Control(privateintnum;privateint[]a=newint[]{1,2};privateint[]b=newint[]{2,3};〃可改變的數組privatestringtitle;privatestringw;privatestringh;privatestringbottomTitle;privateColorc;Point[]p=newPoint[]{newPoint(10,20),newPoint(20,30)};〃畫折線所用的存儲數據工具!privateintaverage=0;Graphicsg;//privatePictureBoxpictureBox1;privateinttotal=0;publiccurve_line(int[]datay,int[]datax)(g=this.CreateGraphics();this.a=datay;this.b=datax;p=(Pointロ)Redim(p,a.Length);〃改變POINT數組大小aver();}〃動態修改數組模塊publicstaticArrayRedim(ArrayorigArray,intdesiredSize){Typet=origArray.GetType().GetElementType();ArraynewArray=Array.CreateInstance(t,desiredSize);Array.Copy(origArray,0,newArray,0,Math.Min(origArray.Length,desiredSize));returnnewArray;)privatevoidaver()(intj=0,k=0,m=0;for(inti=0;i<a.Length;i++)|j=Math.Max(j,a[i]);}while(k<a.Length&&k<b.Length)(p[k]=newPoint(235-a[k],250-b[k]);MessageBox.Show(a[k].ToString(),b[k].ToString());k++;)average=j/a.Length;)privatevoidDrawlmage()(DrawXYO:〃繪XY軸DrawXLine();〃繪X軸分值線DrawYLine();〃繪Y軸分值線DrawalllineO;//DrawAUData。;//繪出所有產品的價格線#region畫出X軸與Y軸privatevoidDrawXY()(intMaxX;intMaxY;//Graphicsg=this.CreateGraphics();MaxX=System.Convert.ToInt32(n235n);MaxY=System.Convert.ToInt32(H250");Pointpxl=newPoint(0,MaxY);Pointpx2=newPoint(MaxX,MaxY);//BrushbackBrush=newSolidBrush(Parent.BackColor);Penaa=newPen(Color.Black);g.DrawLine(aa,pxl.X,pxl.Y,px2.X,px2.Y);Pointpyl=newPoint(0,MaxY);Pointpy2=newPoint(0,0);g.DrawLine(aa,pyl.X,pyl.Y,py2.X,py2.Y);//g.DrawImage()#endregion#region畫出y軸上的分值線privatevoidDrawXLine()(intMaxX;intMaxY;//BrushbackBrush=newSolidBrush(Parent.BackColor);//Graphicsg=this.CreateGraphics();BrushbackBrush=newSolidBrush(Color.Black);MaxX=System.Convert.ToInt32(H234u);MaxY=System.Convert.ToInt32(“250”);for(inti=a.Length;i>0;i—)(intj=average*(i-a.Length);Pointpxl=newPoint(0,MaxY*i/a.Length);Pointpx2=newPoint(MaxX,MaxY*i/a.Length);g.DrawLine(newPen(Color.Black),pxl.X,pxl.Y,px2.X,px2.Y);if(!pxl.YEquals(MaxY))(g.DrawString(j.ToString(),newFont("Ariaド,10,FontStyle.Regular),backBrush,pxl.X,pxl.Y);}#endregion#region畫出x軸上的分值線privatevoidDrawYLine(){intMaxX;intMaxY;BrushbackBrush=newSolidBrush(Color.Black);MaxX=System.Convert.ToInt32(n235H);MaxY=System.Convert.ToInt32(n250n);for(inti=0;i<b.Length;i++){Pointpyl=newPoint(MaxX*i/b.Length,MaxY-5);Pointpy2=newPoint(MaxX*i/b.Length,MaxY);g.DrawLine(newPen(Color.Black),pyl.X,pyl.Y,py2.X,py2.Y);g.DrawString(b[i].ToString(),newFont("Ariaド,10,FontStyle.Regular),backBrush,pyl.X+MaxX/b.Length,py2.Y);})#endregion析egion畫數據privatevoidDrawallline()(g.DrawLine(newPen(Color.Red),0,250,100,250-50);g.DrawLines(newPen(Color.Red),p);)#endregionprotectedoverridevoidOnPaint(PaintEventArgse)(Drawlmage();base.OnPaint(e);
Aflexiblechartinglibraryfor.NETByJChampionLookingforawaytodraw2DlinegraphswithC#?Here*syetanotherchartingclasslibrarywithahighd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 外部資源評估協議
- 珠寶展售保證金合同
- 玉米種植農業生產組織形式與創新考核試卷
- 櫥柜安裝承包協議
- 耐火材料在電力行業的應用案例考核試卷
- 真空泵在環保工程中的應用考核試卷
- 稀土金屬壓延加工的產業協同創新機制探討考核試卷
- 有色金屬礦山生態環境評價與保護考核試卷
- 體育用品生產自動化與智能制造考核試卷
- 稀有金屬礦選礦廠產品質量安全管理與追溯考核試卷
- 小學三年級數學兩位數乘兩位數筆算能力測驗練習題
- 心理發展與教育智慧樹知到期末考試答案章節答案2024年浙江師范大學
- MOOC 國情分析與商業設計-暨南大學 中國大學慕課答案
- MOOC 大學體育-華中科技大學 中國大學慕課答案
- 《光伏發電工程工程量清單計價規范》
- 國家衛生部《綜合醫院分級管理標準》
- DB64++1996-2024+燃煤電廠大氣污染物排放標準
- 初中八年級數學課件-最短路徑-將軍飲馬問題
- 信息論與編碼期末考試題(全套)
- 醫院醫學倫理審查委員會章程
- 房地產銷售價格優惠申請表-
評論
0/150
提交評論