版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
秦軍qjun@可視化編程——C#數(shù)字圖形處理5_21第五章圖形程序設(shè)計(jì)本章主要介紹
GDI+基礎(chǔ)知識(shí)畫筆、畫刷、字體繪制基本圖形方法重點(diǎn)掌握:繪制圖形的基本方法
2基本圖形繪制Graphics類提供了一些繪圖的方法:Draw~、Fill~常用圖形方法:DrawLine:畫線DrawRectangle:畫矩形DrawEllipse:畫圓DrawArc:畫弧線DrawPie:畫扇形FillRectangleFillEllipseFillPie3DrawLine方法繪制一條連接由坐標(biāo)對(duì)指定的兩個(gè)點(diǎn)的線條。方法通常用兩種:publicvoidDrawLine(Penp,intx1,inty1,intx2,inty2);其中:p為畫筆確定線條的顏色、寬度和樣式,(x1,y1)為起點(diǎn)坐標(biāo),(x2,y2)為終點(diǎn)坐標(biāo)。publicvoidDrawLine(Penp,Pointpo1,Pointpo2);其中:p為畫筆,po1,po2表示為Poin結(jié)構(gòu)。po1為起點(diǎn)坐標(biāo),po2為終點(diǎn)坐標(biāo)。4繪制一系列連接一組Point結(jié)構(gòu)的線段。publicvoidDrawLines(Penp,Point[]points)此方法可繪制多條線段。point[0]到point[1]畫第一條線,point[1]到point[2]畫第二條線,以此類推。5例:DrawL1
privatevoidxy坐標(biāo)ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();g.Clear(this.BackColor);Penp1=newPen(Color.Red,2);g.DrawLine(p1,40,50,220,150);}6
privatevoidpoint結(jié)構(gòu)
ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();g.Clear(this.BackColor);Penp1=newPen(Color.Blue,4);Pointpo1=newPoint(200,50);Pointpo2=newPoint(40,150);g.DrawLine(p1,po1,po2);}7privatevoid多線段ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);Penpen=newPen(Color.Black,8);//創(chuàng)建畫筆
Point[]points=//創(chuàng)建Point數(shù)組
{newPoint(50,100),newPoint(150,50),newPoint(220,180),newPoint(55,100)};//畫線g.DrawLines(pen,points);
}8DrawRectangle方法繪制由坐標(biāo)對(duì)、寬度和高度指定的矩形。DrawRectangle(Penpen,intx,inty,intwidth,intheight);其中:pen:為畫筆,(x,y)為矩形左上角坐標(biāo),width,height為矩形的寬和高。DrawRectangle(Penpen,Rectangler);其中:pen為畫筆,r為矩形結(jié)構(gòu)。DrawRectangles(Penpen,Rectangle[]rec)其中:pen為畫筆,rec為矩形結(jié)構(gòu)數(shù)組。9
privatevoid單個(gè)矩形ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);Penpen=newPen(Color.Red,3);//創(chuàng)建畫筆//畫矩形
g.DrawRectangle(pen,20,30,100,150);}
10
privatevoid矩形組ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);Penpen=newPen(Color.Black,3);//創(chuàng)建畫筆
Rectangle[]rects=
//建立矩形數(shù)組
{newRectangle(20,30,70,80),newRectangle(60,90,100,120),newRectangle(100,40,50,100)};//畫矩形g.DrawRectangles(pen,rects);}11DrawEllipe方法繪制一個(gè)由邊框(該邊框由一對(duì)坐標(biāo)、高度和寬度指定)定義的橢圓。畫橢(圓)有兩種方法:DrawEllipse(Pen,intx,inty,intwidth,intheight);其中:pen為畫筆,(x,y)為矩形左上角坐標(biāo),width為矩形的寬,height為矩形的高。DrawEllipse(Pen,Rectangler);其中:pen為畫筆,r為矩形結(jié)構(gòu)。12
privatevoid畫園ToolStripMenuItem_Click(objectsender,EventArgse){Gaphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);//創(chuàng)建畫筆Penpen=newPen(Color.DarkGreen,8);
g.DrawEllipse(pen,30,50,80,120);//坐標(biāo)點(diǎn)畫橢圓
pen.Color=Color.DarkOrange;//改變畫筆的顏色
pen.Width=10;//改變畫筆的寬度
//創(chuàng)建矩形Rectangler=newRectangle(130,50,120,120);g.DrawEllipse(pen,r);//矩形結(jié)構(gòu)畫圓}13DrawArc方法繪制一段弧線,表示由一對(duì)坐標(biāo)、寬度和高度指定的橢圓部分。DrawArc(Pen,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:pen為畫筆,(x,y)為矩形左上角坐標(biāo),width,height為矩形的寬和高,StartAngle為x軸到弧線的起始點(diǎn)沿順時(shí)針方向的角度(以度為單位)EndAngle為從startAngle參數(shù)到弧線的結(jié)束點(diǎn)沿順時(shí)針方向角度(以度為單位)14privatevoid畫弧ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);Penpen=newPen(Color.RoyalBlue,4);//創(chuàng)建畫筆
g.DrawArc(pen,30,30,100,100,90,180);//畫弧}15DrawPie方法繪制一個(gè)扇形,該形狀由一個(gè)坐標(biāo)、寬度、高度以及兩條射線所指定的橢圓(圓)定義,也成為餅圖。DrawPie(Pen,DrawArc(Pen,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:pen為畫筆,(x,y)為矩形左上角坐標(biāo),width,height為矩形的寬和高,StartAngle為x軸到弧線的起始點(diǎn)沿順時(shí)針方向的角度(以度為單位)EndAngle:從startAngle參數(shù)到弧線的結(jié)束點(diǎn)沿順時(shí)針方向角度(以度為單位)16
privatevoidtoolStripMenuItem2_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);Penpen=newPen(Color.Peru,4);//創(chuàng)建畫筆
g.DrawPie(pen,20,30,200,200,0,60);//畫餅圖}17如果將g.DrawPie(pen,20,30,200,200,0,-60);則表示;EndAngle:從startAngle參數(shù)到弧線的結(jié)束點(diǎn)沿逆時(shí)針方向角度18DrawPath方法繪制多條曲線viodDrawPath(Penpen,GraphicsPathpath);其中:pen為畫筆,Path為GraphicsPath類對(duì)象19
privatevoidForm1_Paint(objectsender,PaintEventArgse){//建立對(duì)象GraphicsPathmpath=newGraphicsPath();RectanglemyEllipse=newRectangle(20,20,200,150);//設(shè)置一矩形
mpath.AddEllipse(myEllipse);//追加橢圓路徑
mpath.AddRectangle(myEllipse);//追加矩形路徑
Penmypen=newPen(Color.Blue,4);//畫mpath中的曲線e.Graphics.DrawPath(mypen,mpath);}Drawpath1.cs20小結(jié)基本繪圖的步驟:1、建立圖形對(duì)象Graphicsg….2、清屏(可選)3、創(chuàng)建畫筆Penpen….4、設(shè)置繪圖參數(shù)5、繪圖Draw~21DrawCloseCurve方法繪制經(jīng)過一組指定的Point結(jié)構(gòu)定義的曲線DrawCurve(Pen,Point[])繪制由Point結(jié)構(gòu)的數(shù)組定義的閉合曲線
DrawCloseCurve(Pen,Point[])DrawCurve方法22privatevoid畫曲線ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
g.Clear(this.BackColor);PenredPen=newPen(Color.Red,3);PengreenPen=newPen(Color.Green,7);Pointpoint1=newPoint(50,100);Pointpoint2=newPoint(150,50);Pointpoint3=newPoint(220,180);Pointpoint4=newPoint(55,120);Point[]curvePoints={point1,point2,point3,point4};g.DrawCurve(greenPen,curvePoints);//畫曲線
g.DrawClosedCurve(redPen,curvePoints);//畫閉合曲線}23FillEllipse方法填充邊框所定義的橢圓的內(nèi)部,該邊框由一對(duì)坐標(biāo)、一個(gè)寬度和一個(gè)高度指定。FillEllipse(Brushbrush,Rectanglerec);其中:brush為填充矩形的畫刷,rec矩形結(jié)構(gòu)對(duì)象FillRectangle(Brushbrush,intx1,inty1,intwidth,intheight);24
privatevoid填充橢圓ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
//創(chuàng)建畫刷
SolidBrushbrush=newSolidBrush(Color.SaddleBrown);
g.Clear(this.BackColor);//清畫布//填充橢圓g.FillEllipse(brush,60,60,120,120);}Fillerp1.cs25FillRectangle方法填充由一對(duì)坐標(biāo)、一個(gè)寬度和一個(gè)高度指定的矩形的內(nèi)部。FillRectangle(Brushbrush,Rectanglerec);其中:brush為填充矩形的畫刷,rec矩形結(jié)構(gòu)對(duì)象FillRectangle(Brushbrush,intx1,inty1,intwidth,intheight);26privatevoid填充矩形ToolStripMenuItem_Click(objectsender,EventArgse){//創(chuàng)建圖形對(duì)象Graphicsg=this.CreateGraphics();SolidBrushbrush=//創(chuàng)建畫刷newSolidBrush(Color.Blue);
g.Clear(this.BackColor);//清畫布//填充矩形g.FillRectangle(brush,60,60,150,120);}27FillPie方法填充由一對(duì)坐標(biāo)、一個(gè)寬度、一個(gè)高度以及兩條射線指定的橢圓所定義的扇形區(qū)的內(nèi)部。FillPie(Brush,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:Brush:畫刷,x,y:矩形左上角坐標(biāo),width,height:矩形的寬和高,StartAngle:x軸到弧線的起始點(diǎn)沿順時(shí)針方向的角度(以度為單位)EndAngle:從startAngle參數(shù)到弧線的結(jié)束點(diǎn)沿順時(shí)針方向角度(以度為單位)28
privatevoid填充扇形ToolStripMenuItem_Click(objectsender,EventArgse){//創(chuàng)建圖形對(duì)象Graphicsg=this.CreateGraphics();SolidBrushbrush=//創(chuàng)建畫刷newSolidBrush(Color.Tomato);
g.Clear(this.BackColor);//填充扇形g.FillPie(brush,20,30,200,200,0,60);}29
應(yīng)用30例1使用繪制線段函數(shù)畫任意曲線(Sin曲線.cs)31privatevoidForm1_Paint(objectsender,PaintEventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對(duì)象
Penpen1=newPen(Color.Red,4);//創(chuàng)建畫筆
floatx1,x2,y1,y=80;for(intx=0;x<=360;x++){x1=(float)x;//起始點(diǎn)xx2=(float)(x+1);//結(jié)束點(diǎn)x
//計(jì)算結(jié)束點(diǎn)y值
y1=(float)(80+50*Math.Sin((3.14159/180)*(x)));g.DrawLine(pen1,x1,y,x2,y1);//畫線
y=y1;//賦下一線段的起始點(diǎn)y}}Sin曲線.cs32例2繪制正葉線圖形正葉線數(shù)學(xué)表達(dá)式:r=asin(nθ)x=rcos(θ)(a>0,n=2,3,4,5…)y=rsin(θ)33privatevoidForm1_Paint(objectsender,PaintEventArgse){Graphicsg=this.CreateGraphics();Pointp1=newPoint(0,0);//設(shè)定初始值Pointp2=newPoint(0,0);//設(shè)定初始值Penpen1=newPen(Color.Black,2);//畫筆g.Clear(this.BackColor);inta,n,cx,cy,gx,gy,flag,k;doubler,p,th,x,y,pi;x=p1.X;y=p1.Y;//設(shè)置初值a=120;n=2;pi=3.14159;cx=140;cy=140;flag=0;k=300;正葉線.cs34for(p=1;p>=0.2;p-=0.2){for(th=0;th<=2*pi+0.1;th+=pi/k){r=Math.Abs(a*Math.Cos(n*th)*p);x=(int)(r*Math.Cos(th));y=(int)(r*Math.Sin(th));gx=(int)(cx+x);gy=(int)(cy+y);if(flag==0){p1.X=gx;p1.Y=gy;flag=1;}else{p2.X=gx;p2.Y=gy;g.DrawLine(pen1,p1,p2);p1=p2;}}flag=0;}}35例繪制圓柱體繪制圓柱體的方法:1、利用“Graphics”類的“DrawEllipse”方法從圓柱體的下面到圓柱體的上面繪制一系列橢圓。2、使用“Graphics”類的“FillEllipse”方法將圓柱體最上面的橢圓畫成實(shí)心圓。//圓柱體1privatevoidbutton1_Click(objectsender,EventArgse){//建立“畫布”對(duì)象
Graphicsg=pictureBox1.CreateGraphics();36
Penpen=newPen(Color.DarkGray);
//建立畫筆對(duì)象
SolidBrushbrush=new
SolidBrush(Color.LightGray);
//建立畫刷對(duì)象//圓柱體最下面y坐標(biāo),最左邊x坐標(biāo)
inth=pictureBox1.ClientSize.Height-50;
intw=pictureBox1.ClientSize.Width-20;
intvw=100;
intvh=50;
//矩形坐標(biāo)
for(inti=h;i>8;i--)
//畫一系列橢圓
g.DrawEllipse(pen,(w-100)/2,i,vw,vh);
//圓柱體最上面的實(shí)心橢圓
g.FillEllipse(brush,(w-100)/2,8,vw,vh);}37mouse畫線1鼠標(biāo)左鍵在按下狀態(tài),移動(dòng)鼠標(biāo),每次移動(dòng)很短的距離,畫出該線段,將所有的線段連接起來,形成一條曲線。publicpartialclassForm1:Form{privateboolmark=false;//設(shè)置全局變量privatePointpoint,point2;例利用鼠標(biāo)畫曲線段38//鼠標(biāo)按下事件處理函數(shù)
privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)//按鼠標(biāo)左鍵{point.X=e.X;//獲取當(dāng)前鼠標(biāo)X坐標(biāo)值point.Y=e.Y;//獲取當(dāng)前鼠標(biāo)Y坐標(biāo)值
//設(shè)置標(biāo)志位,表示鼠標(biāo)左鍵已按下,如果鼠標(biāo)移動(dòng)可畫線mark=true;}}39//鼠標(biāo)移動(dòng)事件處理函數(shù)privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(mark)//如果鼠標(biāo)左鍵已按下{Graphicsg=this.CreateGraphics();Penpen1=newPen(Color.Black);point2.X=e.X;//獲取鼠標(biāo)移動(dòng)后的X坐標(biāo)
point2.Y=e.Y;//獲取鼠標(biāo)移動(dòng)后的Y坐標(biāo)g.DrawLine(pen1,point.X,point.Y,e.X,e.Y);point.X=point2.X;//記錄下一線段的起始坐標(biāo)
point.Y=point2.Y;}}40
privatevoidForm1_MouseUp(objectsender,MouseEventArgse){mark=false;//設(shè)置標(biāo)志位鼠標(biāo)移動(dòng)不再畫線}41修改Mouse畫線1程序,解決最小化后再最大化,圖形消失的問題。問題的關(guān)鍵:最小化后簡單變量中的內(nèi)容沒有保存。解決辦法:記錄組成曲線的每一條線段的坐標(biāo),當(dāng)最小化后再最大化時(shí),利用保存的值重畫曲線。使用List類對(duì)象記錄曲線以及曲線中的坐標(biāo)。42泛型泛型為.NET框架引入了類型參數(shù)(typeparameters)的概念。類型參數(shù)使得設(shè)計(jì)類和方法時(shí),不必確定一個(gè)或多個(gè)具體參數(shù),具體參數(shù)可延遲到用戶代碼中聲明、實(shí)現(xiàn)。這意味著使用泛型的類型參數(shù)T,寫一個(gè)類MyList<T>,用戶代碼可以這樣調(diào)用:MyList<int>,MyList<string>或MyList<MyClass>。這避免了運(yùn)行時(shí)類型轉(zhuǎn)換43List類List類是ArrayList類(動(dòng)態(tài)數(shù)組)的泛型等效類。該類使用大小可按需動(dòng)態(tài)增加的數(shù)組。常用屬性:Count:List中實(shí)際包含的元素?cái)?shù)量常用方法:Add:將參數(shù)指定的對(duì)象添加到List對(duì)象結(jié)尾處Clear:從LIst中移除所有元素Insert:插入數(shù)據(jù),第一個(gè)參數(shù)為插入的位置,第二參數(shù)為插入的對(duì)象。Sort對(duì)整個(gè)List中的元素進(jìn)行排序。44
publicpartialclassForm1:Form//添加全局變量{privateboolmark=false;privatePointpoint,point2;
//記錄1條曲線的所有點(diǎn)
privateList<Point>Point_List;
//記錄每條曲線
private
List<List<Point>>Line_List;
publicForm1()//修改構(gòu)造函數(shù){InitializeComponent();
Line_List=newList<List<Point>>();
}Mouse畫線2.cs45privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)//按鼠標(biāo)左鍵
{//建立數(shù)組,記錄1條曲線的所有點(diǎn)Point_List=newList<Point>();point.X=e.X;//獲取當(dāng)前鼠標(biāo)X坐標(biāo)值point.Y=e.Y;//獲取當(dāng)前鼠標(biāo)Y坐標(biāo)值
//設(shè)置標(biāo)志位,表示鼠標(biāo)左鍵已按下,如果鼠標(biāo)移動(dòng)可畫線mark=true;
Point_List.Add(point);
//記錄曲線起始點(diǎn)坐標(biāo)
}}46//鼠標(biāo)移動(dòng)事件處理函數(shù)privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(mark)//如果鼠標(biāo)左鍵已按下{Graphicsg=this.CreateGraphics();Penpen1=newPen(Color.Black);point2.X=e.X;//獲取鼠標(biāo)移動(dòng)后的X坐標(biāo)
point2.Y=e.Y;//獲取鼠標(biāo)移動(dòng)后的Y坐標(biāo)g.DrawLine(pen1,point.X,point.Y,e.X,e.Y);point.X=point2.X;//設(shè)置下一線段的起始坐標(biāo)
point.Y=point2.Y;
Point_List.Add(point);
//記錄曲線下一起始點(diǎn)坐標(biāo)
}}47
privatevoidForm1_MouseUp_1(objectsender,MouseEventArgse){mark=false;
Line_List.Add(Point_List);
//記錄此條線段}48
privatevoidForm1_Paint//重畫(objectsender,PaintEventArgse){Graphicsg=e.Graphics;Penpen1=newPen(Color.Black);Pointp1,p2;
//取出每條線段foreach(List<Point>linLine_List)
//重畫每條線段
for(intk=0;k<(l.Count-1);k++)
{p1=l[k];p2=l[k+1];g.DrawLine(pen1,p1,p2);}}49例利用鍵盤上的4個(gè)箭頭鍵移動(dòng)窗體中的圓(key移動(dòng)1)設(shè)計(jì)思想:使用KeyDow事件:Keys.Left、Keys.RightKeys.Down、Keys.Up每當(dāng)按下鍵盤,1、清空窗體2、改變坐標(biāo)值3、重畫50publicpartialclassForm1:Form{intx=0,y=0;//全局坐標(biāo)變量publicForm1(){InitializeComponent();}voidDrawCir(Colorcolor)//畫圓函數(shù){Graphicsg=this.CreateGraphics();
Penpen1=newPen(color);SolidBrushbrush1=new
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 開學(xué)典禮上發(fā)言
- 新學(xué)期的計(jì)劃錦集七篇資料
- 箱式變壓器安裝施工方案
- 民辦學(xué)校教師管理制度
- 10KV線路工程施工安全管理及風(fēng)險(xiǎn)控制方案
- 施工現(xiàn)場機(jī)械傷害演練預(yù)案
- 2021-2022學(xué)年語文五年級(jí)下冊(cè)期末專項(xiàng)復(fù)習(xí)6-小古文(試題)
- 木樁施工方案
- 1 社會(huì)培訓(xùn)實(shí)施方案
- 現(xiàn)場作文比賽方案
- 預(yù)制梁場成本分析
- 《Monsters 怪獸》中英對(duì)照歌詞
- 華東地區(qū)SMT公司信息
- 物業(yè)管理公司法律顧問服務(wù)方案
- 拌合站粉罐基礎(chǔ)驗(yàn)算(共11頁)
- 自動(dòng)售貨機(jī)投放協(xié)議(模板)
- 簽證用完整戶口本英文翻譯模板
- 初三數(shù)學(xué)第一單元測(cè)試卷(共4頁)
- 甘肅省公路路產(chǎn)損壞賠償收費(fèi)標(biāo)準(zhǔn)
- 骨折病人傷肢腫脹的護(hù)理
- 復(fù)習(xí)酒水投標(biāo)書
評(píng)論
0/150
提交評(píng)論