可视化编程技术及应用_第1页
可视化编程技术及应用_第2页
可视化编程技术及应用_第3页
可视化编程技术及应用_第4页
可视化编程技术及应用_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

秦军qjun@可视化编程——C#数字图形处理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();//创建对象

g.Clear(this.BackColor);Penpen=newPen(Color.Black,8);//创建画笔

Point[]points=//创建Point数组

{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为矩形结构数组。9

privatevoid单个矩形ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//创建对象

g.Clear(this.BackColor);Penpen=newPen(Color.Red,3);//创建画笔//画矩形

g.DrawRectangle(pen,20,30,100,150);}

10

privatevoid矩形组ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//创建对象

g.Clear(this.BackColor);Penpen=newPen(Color.Black,3);//创建画笔

Rectangle[]rects=

//建立矩形数组

{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();//创建对象

g.Clear(this.BackColor);//创建画笔Penpen=newPen(Color.DarkGreen,8);

g.DrawEllipse(pen,30,50,80,120);//坐标点画椭圆

pen.Color=Color.DarkOrange;//改变画笔的颜色

pen.Width=10;//改变画笔的宽度

//创建矩形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参数到弧线的结束点沿顺时针方向角度(以度为单位)14privatevoid画弧ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//创建对象

g.Clear(this.BackColor);Penpen=newPen(Color.RoyalBlue,4);//创建画笔

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参数到弧线的结束点沿顺时针方向角度(以度为单位)16

privatevoidtoolStripMenuItem2_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//创建对象

g.Clear(this.BackColor);Penpen=newPen(Color.Peru,4);//创建画笔

g.DrawPie(pen,20,30,200,200,0,60);//画饼图}17如果将g.DrawPie(pen,20,30,200,200,0,-60);则表示;EndAngle:从startAngle参数到弧线的结束点沿逆时针方向角度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、创建画笔Penpen….4、设置绘图参数5、绘图Draw~21DrawCloseCurve方法绘制经过一组指定的Point结构定义的曲线DrawCurve(Pen,Point[])绘制由Point结构的数组定义的闭合曲线

DrawCloseCurve(Pen,Point[])DrawCurve方法22privatevoid画曲线ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//创建对象

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方法填充边框所定义的椭圆的内部,该边框由一对坐标、一个宽度和一个高度指定。FillEllipse(Brushbrush,Rectanglerec);其中:brush为填充矩形的画刷,rec矩形结构对象FillRectangle(Brushbrush,intx1,inty1,intwidth,intheight);24

privatevoid填充椭圆ToolStripMenuItem_Click(objectsender,EventArgse){Graphicsg=this.CreateGraphics();//创建对象

//创建画刷

SolidBrushbrush=newSolidBrush(Color.SaddleBrown);

g.Clear(this.BackColor);//清画布//填充椭圆g.FillEllipse(brush,60,60,120,120);}Fillerp1.cs25FillRectangle方法填充由一对坐标、一个宽度和一个高度指定的矩形的内部。FillRectangle(Brushbrush,Rectanglerec);其中:brush为填充矩形的画刷,rec矩形结构对象FillRectangle(Brushbrush,intx1,inty1,intwidth,intheight);26privatevoid填充矩形ToolStripMenuItem_Click(objectsender,EventArgse){//创建图形对象Graphicsg=this.CreateGraphics();SolidBrushbrush=//创建画刷newSolidBrush(Color.Blue);

g.Clear(this.BackColor);//清画布//填充矩形g.FillRectangle(brush,60,60,150,120);}27FillPie方法填充由一对坐标、一个宽度、一个高度以及两条射线指定的椭圆所定义的扇形区的内部。FillPie(Brush,intx,inty,intwidth,intheight,intStartAngle,intEndtAngle);其中:Brush:画刷,x,y:矩形左上角坐标,width,height:矩形的宽和高,StartAngle:x轴到弧线的起始点沿顺时针方向的角度(以度为单位)EndAngle:从startAngle参数到弧线的结束点沿顺时针方向角度(以度为单位)28

privatevoid填充扇形ToolStripMenuItem_Click(objectsender,EventArgse){//创建图形对象Graphicsg=this.CreateGraphics();SolidBrushbrush=//创建画刷newSolidBrush(Color.Tomato);

g.Clear(this.BackColor);//填充扇形g.FillPie(brush,20,30,200,200,0,60);}29

应用30例1使用绘制线段函数画任意曲线(Sin曲线.cs)31privatevoidForm1_Paint(objectsender,PaintEventArgse){Graphicsg=this.CreateGraphics();//创建对象

Penpen1=newPen(Color.Red,4);//创建画笔

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绘制正叶线图形正叶线数学表达式: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鼠标左键在按下状态,移动鼠标,每次移动很短的距离,画出该线段,将所有的线段连接起来,形成一条曲线。publicpartialclassForm1:Form{privateboolmark=false;//设置全局变量privatePointpoint,point2;例利用鼠标画曲线段38//鼠标按下事件处理函数

privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)//按鼠标左键{point.X=e.X;//获取当前鼠标X坐标值point.Y=e.Y;//获取当前鼠标Y坐标值

//设置标志位,表示鼠标左键已按下,如果鼠标移动可画线mark=true;}}39//鼠标移动事件处理函数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程序,解决最小化后再最大化,图形消失的问题。问题的关键:最小化后简单变量中的内容没有保存。解决办法:记录组成曲线的每一条线段的坐标,当最小化后再最大化时,利用保存的值重画曲线。使用List类对象记录曲线以及曲线中的坐标。42泛型泛型为.NET框架引入了类型参数(typeparameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,具体参数可延迟到用户代码中声明、实现。这意味着使用泛型的类型参数T,写一个类MyList<T>,用户代码可以这样调用:MyList<int>,MyList<string>或MyList<MyClass>。这避免了运行时类型转换43List类List类是ArrayList类(动态数组)的泛型等效类。该类使用大小可按需动态增加的数组。常用属性:Count:List中实际包含的元素数量常用方法:Add:将参数指定的对象添加到List对象结尾处Clear:从LIst中移除所有元素Insert:插入数据,第一个参数为插入的位置,第二参数为插入的对象。Sort对整个List中的元素进行排序。44

publicpartialclassForm1:Form//添加全局变量{privateboolmark=false;privatePointpoint,point2;

//记录1条曲线的所有点

privateList<Point>Point_List;

//记录每条曲线

private

List<List<Point>>Line_List;

publicForm1()//修改构造函数{InitializeComponent();

Line_List=newList<List<Point>>();

}Mouse画线2.cs45privatevoidForm1_MouseDown(objectsender,MouseEventArgse){if(e.Button==MouseButtons.Left)//按鼠标左键

{//建立数组,记录1条曲线的所有点Point_List=newList<Point>();point.X=e.X;//获取当前鼠标X坐标值point.Y=e.Y;//获取当前鼠标Y坐标值

//设置标志位,表示鼠标左键已按下,如果鼠标移动可画线mark=true;

Point_List.Add(point);

//记录曲线起始点坐标

}}46//鼠标移动事件处理函数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)//画圆函数{Graphicsg=this.CreateGraphics();

Penpen1=newPen(color);SolidBrushbrush1=new

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论