1、清华大学 黄维通 设计制作,1,第7章 图形设计与应用,清华大学 黄维通 设计制作,2,本章主要内容,用C语言图形库函数绘图复杂图形的绘制和图形程序设计方法,清华大学 黄维通 设计制作,3,图形化界面是软件的趋势,图形化界面具有界面友好、交互性强的特点,但图形界面的开发相对来说会麻烦一些,因此难度也就大一些,一般来说,图形界面的开发,经常与屏幕的分辨率有关。,清华大学 黄维通 设计制作,4,7.1 用C语言图形库函数绘图,清华大学 黄维通 设计制作,5,显示器的工作方式,7.1.1 显示方式及图形方式的初始化,文本方式,图形方式,屏幕上显示的最小单位是字符。不同的文本方式对应相应的行数、列数和
2、颜色。左上角位置为(1,1)。,一像素作为屏幕上的最小单元,以屏幕的左上角为原点,位置为(0,0)。,清华大学 黄维通 设计制作,6,例】用不同的字体和背景颜色显示ASCII码字符 #include “conio.h” void main() int i,j,k;for(i=0;i16;i+)for(j=0;j16;j+) textbackground(i); /置文本屏幕的背景色(0Black1Blue2Green )textcolor(j); /置字符在文本屏幕上显示的颜色(0Black1Blue2Greenfor(k=0;k256;k+) if(k=7) continue; /不要响铃c
3、printf(“%c”,k); /类似printf(),写入当前文本屏幕而不是stdout 将格式化输出写到活动窗口中getch(); /按任意键继续 ,颜色值见教材,清华大学 黄维通 设计制作,7,【例】绘制右图 #include “conio.h” /Screen-handing functions #include “graphics.h” /Graphics functions void main() int x;int gdriver=DETECT,gmode;initgraph( /将背景色改为用color指定的颜色。9LightBLUE,在图形方式下,以屏幕的左上角为原点,向右为
4、X轴正方向,向下为Y轴正方向,屏幕上的每一个点的位置就根据这个坐标系来确定,1 基本画线类函数的应用,清华大学 黄维通 设计制作,8,for(x=160;x=480;x+=20) line(160,240,x,120);line(160,240,x,360);line(480,240,640-x,360);line(480,240,640-x,120);getch();closegraph(); ,Tc3运行环境-选择Option菜单中的Linker-选择Library-在对话框中选中Graphics library(具体见附录),注意,清华大学 黄维通 设计制作,9,【例】将屏幕初始化成VG
5、A高分辨率。 #include “conio.h” /Screen-handing functions #include /Graphics functions void main() int gdriver,gmode;gdriver=VGA;/图形驱动程序是VGAgmode=VGAHI; /VGA高分辨率模式initgraph( /关闭图形模式 ,清华大学 黄维通 设计制作,10,【例】用line和lineto函数画三角形。 #include /Graphics functions #include /Screen-handing functions void main() int gd=
6、DETECT,gm; /图形初始化initgraph( ,7.1.2常用图形函数,清华大学 黄维通 设计制作,11,【例】用8个弧画完整的椭圆(其中每画一个弧后按任意键画下一段弧线) #include #include void main() int s;int gd=DETECT,gm;initgraph( ,其它画弧函数自己看书上机实践,清华大学 黄维通 设计制作,12,2 基本图形类函数的应用,void rectangle(int x1,int y1,int x2,int y2); void circle(int x,int y, int r); void drawpoly(int n,
7、 int xy2n);,画折线,折线的顶点个数,存放n个顶点坐标,画矩形,清华大学 黄维通 设计制作,13,【例】画一个六边形 #include #include void main() int gd=DETECT, gm, n=7;int xy=150,5,0,190,150,380,300,380,450,190,300,5,150,5;initgraph( ,清华大学 黄维通 设计制作,14,3 屏幕管理类函数的应用,void setviewport(int x1,int y1,int x2,int y2,int clip);,设置视图区,决定裁剪否。若clip=1,图形输出将只显示在视
8、图区内,超出部分被自动裁剪掉。若clip=0,将不会被裁剪掉,清华大学 黄维通 设计制作,15,void clearviewport(); 清除视图区内显示的内容void cleardevice(); 清屏函数。文本模式下的清屏函数是clrscr()。cleardevice的作用是清除屏幕上的所有内容void moveto(int x,int y);把当前点定位于指定点(x,y),清华大学 黄维通 设计制作,16,【例】用各种线型演示矩形和圆 #include #include void main() int gd=DETECT,gm;initgraph( ,4 图形属性控制类函数的应用,样式
9、见教材,清华大学 黄维通 设计制作,17,【例】演示填充效果 #include #include void main() int gd=DETECT,gm; initgraph( ,5 填充类函数的应用,清华大学 黄维通 设计制作,18,【例】函数rectangle/bar/bar3d的区别 #include #include void main() int gd= DETECT,gm; initgraph(,清华大学 黄维通 设计制作,19,for(i=0;i13;i+) cleardevice();setfillstyle(i,3); /填充样式rectangle(400,10,600,4
10、00); /矩形bar(10,10,300,100);bar3d(10,150,300,250,20,1);bar3d(10,300,300,400,20,0);getch(); closegraph(); ,清华大学 黄维通 设计制作,20,6 获取屏幕当前显示模式属性函数,【例】获取屏幕属性 #include #include #include void main() int gd=DETECT,gm; initgraph(/获取驱动名称,清华大学 黄维通 设计制作,21,printf(“tthe current graphics mode numberis %dn“,getgraphmo
11、de();/获取显示模式 printf(“t the current graphics mode is%s“,getmodename(getgraphmode(); /获取指向当前显示模式的字符串的指针 getch(); closegraph(); ,清华大学 黄维通 设计制作,22,7 图形方式下的文本输出,void settextstyle(int font, int direction, int charsize);,HORIZ_DIR=0 从左向右输出(默认) VERT_DIR=0 从下向上输出,清华大学 黄维通 设计制作,23,void outtext(char *string)vo
12、id outtextxy(int x,int y,char *string);函数outtext在当前位置按照settextstyle中direction指定的方向输出字符串指针string所指的字符串。,清华大学 黄维通 设计制作,24,void settextjustify(int horiz,int vert)在使用outtextxy进行文本输出时,字符串怎样根据(x,y)确定位置呢?具体地说,是把第一个字符定位于(x,y)呢?还是把最后一个字符定位于(x,y)呢?抑或是中间的呢?settextjustify函数解决了这个问题。,对齐方式见教材,清华大学 黄维通 设计制作,25,void
13、 sprintf(char *string,char *format,argument,);图形方式下,outtext和outtextxy无疑是最完善的输出方式。但是,这两个函数的输出对象都是字符串。那么,如果要输出变量的值应该如何做?sprintf函数解决了这个问题。,清华大学 黄维通 设计制作,26,【例】利用改变字体大小和方向的方法实现动画效果 #include #include #include #include void main() int gd=DETECT,gm;initgraph( /设置字体颜色,清华大学 黄维通 设计制作,27,int i,j,x,y; char a8;
14、sprintf(a,“Hello!“); for(i=0;i11;i+) x=500; y=50;for(j=1;j11;j+) cleardevice();x-=15; y+=15;settextstyle(i,0,j); /设置文本样式settextjustify(1,1); /设置对齐方式outtextxy(x,y,a); /输出文本delay(200); /时间延迟200ms getch(); closegraph(); ,清华大学 黄维通 设计制作,28, void getimage(int x1,int y1,int x2,int y2,void *buf); 把矩形区域内的图形复
15、制到buf所指向的内存区域。void putimage(int x,int y,void *buf,int mode) 把存储在buf所指向的内存区域中的图形(由函数getimage产生)复制到屏幕上,8 屏幕图像的存储与应用,mode 是屏幕模式,见教材,清华大学 黄维通 设计制作,29,7.2复杂图形的绘制和图形程序设计方法,清华大学 黄维通 设计制作,30,【例】给定一组实验数据,根据数据的值绘制曲线。假设有一组平均分布在X轴上的数据,值为4.9,8.3,13.9,23.32,39.8,48.9,57.0,68.78,79.7,99.2,用图形表示,清华大学 黄维通 设计制作,31,#i
16、nclude #include #include void main() char *cat=“1“,“2“,“3“,“4“,“5“,“6“,“7“,“8“,“9“,“10“;float a=4.9,8.3,13.9,23.32,39.8,48.9,57.0,68.78,79.7,99.2; char xname=“X“; char yname=“Y“; char s10;,清华大学 黄维通 设计制作,32,int gd=DETECT,gm; initgraph( /画线 ,清华大学 黄维通 设计制作,33,setcolor(1); rectangle(80,y,100+n*20,15); j
17、=0; for(i=100;i=80+n*20;i+=20) line(i,y,i,y+5);outtextxy(i-4,y+10,catj); /输出X轴坐标值j+; for(j=0;jy;j+=50) line(70,y-j,80,y-j); /Y轴坐标sprintf(s,“%d“,j);outtextxy(45,y-j-3,s); /输出Y轴值outtextxy(290,y+20,xname); /输出字母Xsettextstyle(0,1,1);outtextxy(30,40,yname); /输出字母Ygetch(); closegraph(); ,清华大学 黄维通 设计制作,34,
18、7.2.2图形程序设计中的递归算法及其应用,这个图案极有规律。如果把大三角形的每一个角切下来再放大的话,得到的图形和原来的整个图形样式是一样的,清华大学 黄维通 设计制作,35,【例】显示上面讨论的三角形图形 #include #include #include void fun(int x1,int y1,int x2,int y2,int x3,int y3,int n) int a,b,c,d,e,f;if(n0) /结束递归的条件 a=(x1+x2)/2;b=(y1+y2)/2;/求三角形边的中点坐标c=(x2+x3)/2;d=(y2+y3)/2;/求三角形边的中点坐标,清华大学 黄维
19、通 设计制作,36,e=(x1+x3)/2;f=(y1+y3)/2; /求三角形边的中点坐标 moveto(a,b); /画三角形 lineto(c,d); lineto(e,f); lineto(a,b); fun(x1,y1,a,b,e,f,n-1); /递归调用 fun(x2,y2,c,d,a,b,n-1); fun(x3,y3,e,f,c,d,n-1); ,清华大学 黄维通 设计制作,37,void main() int n,xa=10,ya=10,xb=10,yb=470,xc=630,yc=470; /大三角形的三顶点 int gd=DETECT,gm; printf(“in nn“); scanf(“%d“, /设置线型颜色,清华大学 黄维通 设计制作,38,moveto(xa,ya); /画三角形 lineto(xb,yb); lineto(xc,yc); lineto(xa,ya); fun(xa,ya,xb,yb,xc,yc,n); /调用函数,画内接三角形 getch(); closegraph(); ,