版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
秦軍qjun@可視化編程——C#數(shù)字圖形處理5_21第五章圖形程序設計本章主要介紹
GDI+基礎知識畫筆、畫刷、字體繪制基本圖形方法重點掌握:繪制圖形的基本方法
2基本圖形繪制Graphics類提供了一些繪圖的方法:Draw~、Fill~常用圖形方法:DrawLine:畫線DrawRectangle:畫矩形DrawEllipse:畫圓DrawArc:畫弧線DrawPie:畫扇形FillRectangleFillEllipseFillPie3DrawLine方法繪制一條連接由坐標對指定的兩個點的線條。方法通常用兩種:publicvoidDrawLine(Penp,intx1,inty1,intx2,inty2);其中:p為畫筆確定線條的顏色、寬度和樣式,(x1,y1)為起點坐標,(x2,y2)為終點坐標。publicvoidDrawLine(Penp,Pointpo1,Pointpo2);其中:p為畫筆,po1,po2表示為Poin結構。po1為起點坐標,po2為終點坐標。4繪制一系列連接一組Point結構的線段。publicvoidDrawLines(Penp,Point[]points)此方法可繪制多條線段。point[0]到point[1]畫第一條線,point[1]到point[2]畫第二條線,以此類推。5例:DrawL1
privatevoidxy坐標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結構
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)建對象
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方法繪制由坐標對、寬度和高度指定的矩形。DrawRectangle(Penpen,intx,inty,intwidth,intheight);其中:pen:為畫筆,(x,y)為矩形左上角坐標,width,height為矩形的寬和高。DrawRectangle(Penpen,Rectangler);其中:pen為畫筆,r為矩形結構。DrawRectangles(Penpen,Rectangle[]rec)其中:pen為畫筆,rec為矩形結構數(shù)組。9
privatevoid單個矩形ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對象
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)建對象
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方法繪制一個由邊框(該邊框由一對坐標、高度和寬度指定)定義的橢圓。畫橢(圓)有兩種方法:DrawEllipse(Pen,intx,inty,intwidth,intheight);其中:pen為畫筆,(x,y)為矩形左上角坐標,width為矩形的寬,height為矩形的高。DrawEllipse(Pen,Rectangler);其中:pen為畫筆,r為矩形結構。12
privatevoid畫園ToolStripMenuItem_Click(objectsender,EventArgse){Gaphicsg=this.CreateGraphics();//創(chuàng)建對象
g.Clear(this.BackColor);//創(chuàng)建畫筆Penpen=newPen(Color.DarkGreen,8);
g.DrawEllipse(pen,30,50,80,120);//坐標點畫橢圓
pen.Color=Color.DarkOrange;//改變畫筆的顏色
pen.Width=10;//改變畫筆的寬度
//創(chuàng)建矩形Rectangler=newRectangle(130,50,120,120);g.DrawEllipse(pen,r);//矩形結構畫圓}13DrawArc方法繪制一段弧線,表示由一對坐標、寬度和高度指定的橢圓部分。DrawArc(Pen,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:pen為畫筆,(x,y)為矩形左上角坐標,width,height為矩形的寬和高,StartAngle為x軸到弧線的起始點沿順時針方向的角度(以度為單位)EndAngle為從startAngle參數(shù)到弧線的結束點沿順時針方向角度(以度為單位)14privatevoid畫弧ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對象
g.Clear(this.BackColor);Penpen=newPen(Color.RoyalBlue,4);//創(chuàng)建畫筆
g.DrawArc(pen,30,30,100,100,90,180);//畫弧}15DrawPie方法繪制一個扇形,該形狀由一個坐標、寬度、高度以及兩條射線所指定的橢圓(圓)定義,也成為餅圖。DrawPie(Pen,DrawArc(Pen,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:pen為畫筆,(x,y)為矩形左上角坐標,width,height為矩形的寬和高,StartAngle為x軸到弧線的起始點沿順時針方向的角度(以度為單位)EndAngle:從startAngle參數(shù)到弧線的結束點沿順時針方向角度(以度為單位)16
privatevoidtoolStripMenuItem2_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對象
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ù)到弧線的結束點沿逆時針方向角度18DrawPath方法繪制多條曲線viodDrawPath(Penpen,GraphicsPathpath);其中:pen為畫筆,Path為GraphicsPath類對象19
privatevoidForm1_Paint(objectsender,PaintEventArgse){//建立對象GraphicsPathmpath=newGraphicsPath();RectanglemyEllipse=newRectangle(20,20,200,150);//設置一矩形
mpath.AddEllipse(myEllipse);//追加橢圓路徑
mpath.AddRectangle(myEllipse);//追加矩形路徑
Penmypen=newPen(Color.Blue,4);//畫mpath中的曲線e.Graphics.DrawPath(mypen,mpath);}Drawpath1.cs20小結基本繪圖的步驟:1、建立圖形對象Graphicsg….2、清屏(可選)3、創(chuàng)建畫筆Penpen….4、設置繪圖參數(shù)5、繪圖Draw~21DrawCloseCurve方法繪制經(jīng)過一組指定的Point結構定義的曲線DrawCurve(Pen,Point[])繪制由Point結構的數(shù)組定義的閉合曲線
DrawCloseCurve(Pen,Point[])DrawCurve方法22privatevoid畫曲線ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對象
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)部,該邊框由一對坐標、一個寬度和一個高度指定。FillEllipse(Brushbrush,Rectanglerec);其中:brush為填充矩形的畫刷,rec矩形結構對象FillRectangle(Brushbrush,intx1,inty1,intwidth,intheight);24
privatevoid填充橢圓ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對象
//創(chuàng)建畫刷
SolidBrushbrush=newSolidBrush(Color.SaddleBrown);
g.Clear(this.BackColor);//清畫布//填充橢圓g.FillEllipse(brush,60,60,120,120);}Fillerp1.cs25FillRectangle方法填充由一對坐標、一個寬度和一個高度指定的矩形的內(nèi)部。FillRectangle(Brushbrush,Rectanglerec);其中:brush為填充矩形的畫刷,rec矩形結構對象FillRectangle(Brushbrush,intx1,inty1,intwidth,intheight);26privatevoid填充矩形ToolStripMenuItem_Click(objectsender,EventArgse){//創(chuàng)建圖形對象Graphicsg=this.CreateGraphics();SolidBrushbrush=//創(chuàng)建畫刷newSolidBrush(Color.Blue);
g.Clear(this.BackColor);//清畫布//填充矩形g.FillRectangle(brush,60,60,150,120);}27FillPie方法填充由一對坐標、一個寬度、一個高度以及兩條射線指定的橢圓所定義的扇形區(qū)的內(nèi)部。FillPie(Brush,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:Brush:畫刷,x,y:矩形左上角坐標,width,height:矩形的寬和高,StartAngle:x軸到弧線的起始點沿順時針方向的角度(以度為單位)EndAngle:從startAngle參數(shù)到弧線的結束點沿順時針方向角度(以度為單位)28
privatevoid填充扇形ToolStripMenuItem_Click(objectsender,EventArgse){//創(chuàng)建圖形對象Graphicsg=this.CreateGraphics();SolidBrushbrush=//創(chuàng)建畫刷newSolidBrush(Color.Tomato);
g.Clear(this.BackColor);//填充扇形g.FillPie(brush,20,30,200,200,0,60);}29
應用30例1使用繪制線段函數(shù)畫任意曲線(Sin曲線.cs)31privatevoidForm1_Paint(objectsender,PaintEventArgse){Graphicsg=this.CreateGraphics();//創(chuàng)建對象
Penpen1=newPen(Color.Red,4);//創(chuàng)建畫筆
floatx1,x2,y1,y=80;for(intx=0;x<=360;x++){x1=(float)x;//起始點xx2=(float)(x+1);//結束點x
//計算結束點y值
y1=(float)(80+50*Math.Sin((3.14159/180)*(x)));g.DrawLine(pen1,x1,y,x2,y1);//畫線
y=y1;//賦下一線段的起始點y}}Sin曲線.cs32例2繪制正葉線圖形正葉線數(shù)學表達式: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);//設定初始值Pointp2=newPoint(0,0);//設定初始值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;//設置初值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”方法將圓柱體最上面的橢圓畫成實心圓。//圓柱體1privatevoidbutton1_Click(objectsender,EventArgse){//建立“畫布”對象
Graphicsg=pictureBox1.CreateGraphics();36
Penpen=newPen(Color.DarkGray);
//建立畫筆對象
SolidBrushbrush=new
SolidBrush(Color.LightGray);
//建立畫刷對象//圓柱體最下面y坐標,最左邊x坐標
inth=pictureBox1.ClientSize.Height-50;
intw=pictureBox1.ClientSize.Width-20;
intvw=100;
intvh=50;
//矩形坐標
for(inti=h;i>8;i--)
//畫一系列橢圓
g.DrawEllipse(pen,(w-100)/2,i,vw,vh);
//圓柱體最上面的實心橢圓
g.FillEllipse(brush,(w-100)/2,8,vw,vh);}37mouse畫線1鼠標左鍵在按下狀態(tài),移動鼠標,每次移動很短的距離,畫出該線段,將所有的線段連接起來,形成一條曲線。publicpartialclassForm1:Form{privateboolmark=false;//設置全局變量privatePointpoint,point2;例利用鼠標畫曲線段38//鼠標按下事件處理函數(shù)
privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)//按鼠標左鍵{point.X=e.X;//獲取當前鼠標X坐標值point.Y=e.Y;//獲取當前鼠標Y坐標值
//設置標志位,表示鼠標左鍵已按下,如果鼠標移動可畫線mark=true;}}39//鼠標移動事件處理函數(shù)privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(mark)//如果鼠標左鍵已按下{Graphicsg=this.CreateGraphics();Penpen1=newPen(Color.Black);point2.X=e.X;//獲取鼠標移動后的X坐標
point2.Y=e.Y;//獲取鼠標移動后的Y坐標g.DrawLine(pen1,point.X,point.Y,e.X,e.Y);point.X=point2.X;//記錄下一線段的起始坐標
point.Y=point2.Y;}}40
privatevoidForm1_MouseUp(objectsender,MouseEventArgse){mark=false;//設置標志位鼠標移動不再畫線}41修改Mouse畫線1程序,解決最小化后再最大化,圖形消失的問題。問題的關鍵:最小化后簡單變量中的內(nèi)容沒有保存。解決辦法:記錄組成曲線的每一條線段的坐標,當最小化后再最大化時,利用保存的值重畫曲線。使用List類對象記錄曲線以及曲線中的坐標。42泛型泛型為.NET框架引入了類型參數(shù)(typeparameters)的概念。類型參數(shù)使得設計類和方法時,不必確定一個或多個具體參數(shù),具體參數(shù)可延遲到用戶代碼中聲明、實現(xiàn)。這意味著使用泛型的類型參數(shù)T,寫一個類MyList<T>,用戶代碼可以這樣調(diào)用:MyList<int>,MyList<string>或MyList<MyClass>。這避免了運行時類型轉換43List類List類是ArrayList類(動態(tài)數(shù)組)的泛型等效類。該類使用大小可按需動態(tài)增加的數(shù)組。常用屬性:Count:List中實際包含的元素數(shù)量常用方法:Add:將參數(shù)指定的對象添加到List對象結尾處Clear:從LIst中移除所有元素Insert:插入數(shù)據(jù),第一個參數(shù)為插入的位置,第二參數(shù)為插入的對象。Sort對整個List中的元素進行排序。44
publicpartialclassForm1:Form//添加全局變量{privateboolmark=false;privatePointpoint,point2;
//記錄1條曲線的所有點
privateList<Point>Point_List;
//記錄每條曲線
private
List<List<Point>>Line_List;
publicForm1()//修改構造函數(shù){InitializeComponent();
Line_List=newList<List<Point>>();
}Mouse畫線2.cs45privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)//按鼠標左鍵
{//建立數(shù)組,記錄1條曲線的所有點Point_List=newList<Point>();point.X=e.X;//獲取當前鼠標X坐標值point.Y=e.Y;//獲取當前鼠標Y坐標值
//設置標志位,表示鼠標左鍵已按下,如果鼠標移動可畫線mark=true;
Point_List.Add(point);
//記錄曲線起始點坐標
}}46//鼠標移動事件處理函數(shù)privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(mark)//如果鼠標左鍵已按下{Graphicsg=this.CreateGraphics();Penpen1=newPen(Color.Black);point2.X=e.X;//獲取鼠標移動后的X坐標
point2.Y=e.Y;//獲取鼠標移動后的Y坐標g.DrawLine(pen1,point.X,point.Y,e.X,e.Y);point.X=point2.X;//設置下一線段的起始坐標
point.Y=point2.Y;
Point_List.Add(point);
//記錄曲線下一起始點坐標
}}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個箭頭鍵移動窗體中的圓(key移動1)設計思想:使用KeyDow事件:Keys.Left、Keys.RightKeys.Down、Keys.Up每當按下鍵盤,1、清空窗體2、改變坐標值3、重畫50publicpartialclassForm1:Form{intx=0,y=0;//全局坐標變量publicForm1(){InitializeComponent();}voidDrawCir(Colorcolor)//畫圓函數(shù){Graphicsg=this.CreateGraphics();
Penpen1=newPen(color);SolidBrushbrush1=new
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 甜菜種植合同法院判決書
- 《藍田股份分析案例》課件
- 2025年南寧貨運從業(yè)資格證模擬考試題庫及答案解析
- 2025年鹽城道路運輸從業(yè)資格證考哪些項目
- 2025年許昌貨運從業(yè)資格證模擬考試系統(tǒng)
- 2025年云南貨運從業(yè)資格證考試題及答案詳解
- 健身房環(huán)境衛(wèi)生保潔員招聘合同
- 城市景觀照明施工合同范本
- 智能家居網(wǎng)絡安全操作規(guī)程
- 印刷行業(yè)安全規(guī)程
- 高三英語二輪復習寫作專項讀后續(xù)寫人物情緒描寫方法課件
- 殯儀館物業(yè)服務方案
- 電廠缺陷分析報告
- 化工裝備的選型與設計
- 外賣小哥培訓道路安全管理
- 上市公司投資報告分析報告
- 中醫(yī)診療設備種類目錄
- (完整)馬克思主義政治經(jīng)濟學習題及參考答案
- 醫(yī)院預防保健科工作制度及職責范本
- 分離工程課件
- 中國風古詩詞詩歌朗讀比賽大會唐詩宋詞含內(nèi)容課件兩篇
評論
0/150
提交評論