版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
图形程序设计基础第1页,课件共101页,创作于2023年2月7.1屏幕设置在屏幕上进行绘图的一般步骤:(1)设置屏幕为图形方式;(2)选择背景与实体颜色;(3)计算坐标;(4)调用绘图语句绘制实体。第2页,课件共101页,创作于2023年2月7.1.1屏幕显示方式与坐标系
在屏幕上显示图形的方式称图形方式。屏幕是由像素点组成的,其像素点多少决定了屏幕的分辨率。分辨率越高,显示图形越细致,质量越好。例如,CGA显示器的分辨率为320*200;而TVGA显示器分辨率为1024*768,所以TVGA比CGA分辨率高,显示图形质量比CGA要好得多。第3页,课件共101页,创作于2023年2月7.1.1屏幕显示方式与坐标系在图形方式下,屏幕上每个像素的显示位置用点坐标来描述。如右图所示,在此坐标系中,屏幕左上角为坐标原点(0,0),水平方向为x轴,自左向右;垂直方向为y轴,自上向下。分辨率不同,水平方向和垂直方向的点数也不一样,即其Maxx,Maxy数值也不同。0
MaxxMaxy第4页,课件共101页,创作于2023年2月7.1.1屏幕显示方式与坐标系坐标的两种给出形式:绝对坐标
VS相对坐标
绝对坐标:参考点是坐标的原点(0,0),x和y只能取规定范围的正整数,其坐标值在整个屏幕范围内确定。相对坐标:参考点不是坐标系的原点,而是当前点。x和y的取值是相对于当前点在x方向和y方向上的增量,这个增量可以是正的,也可以是负的,所以x和y可以是正整数,也可以是负整数。此外,把一个窗口范围内确定的坐标也称作相对坐标。
第5页,课件共101页,创作于2023年2月O(0,0)A(100,100)C(50,80)D(210,80)B(150,200)相对坐标相对于相同点的不同坐标相对于A,B为(50,100)相对于A,C为(-50,-20)相对于A,D为(110,-50)相对于A,B为(50,100)相对于不同参照点,相对于B,D(60,-120)相对于C,D(160,-30)第6页,课件共101页,创作于2023年2月7.1.2图形驱动程序与图形模式图形驱动程序
由于图形显示器的种类繁多,其控制方式也各有差异,所以要显示图形就需先装入相应的符号常量和规定值。TurboC提供了几种图形驱动程序可以支持图形适配器,下表(7-1)列出相应的符号常量和规定值。表7-1符号常量数值符号常量数值DETECT0
IBM85146CGA1
HERCMONO7MCGA2ATT4008EGA3VGA9EGA644PC327010EGAMONO5第7页,课件共101页,创作于2023年2月7.1.2图形驱动程序与图形模式每种图形显示器各有几种不同的图形显示模式,因此要显示图形就必须确定所用的显示模式不同的图形驱动程序有不同的图形模式;即使在同一图形驱动程序下,也可能会有几种图形模式,如表7-2所示表7-2驱动程序(gdriver)图形模式(gmode)取值分辨率调色板VGAVGALOVGAMEDVGAHI012640×200640×350640×48016色16色16色PC3270PC3270HI0720×350256色
IBM8514IBM8514LOIBM8514HI01640×1801024×768256色256色第8页,课件共101页,创作于2023年2月7.1.3图形系统初始化和模式控制
TurboC图形功能极为丰富,具有70多个图形库函数。所有这些图形函数均在头文件“graphics.h”中定义凡是在程序中要调用这些图形函数,都必须在程序文件的开头写上文件包含命令:#include<graphics.h>本节主要讨论:图形系统初始化图形系统的关闭
图形模式的控制
第9页,课件共101页,创作于2023年2月图形系统初始化在文本方式下,所有的图形函数均不能操作,因此在使用图形函数绘图之前,必须将屏幕显示适配器设置为一种图形模式,这就是图形初始化过程。图形系统初始化首先要调用initgraph()函数,如下:voidfarinitgraph(int*gdriver,int*gmode,char*path);参数含义:Gdriver:整型值,用来指定要装入的图形驱动程序,该值在头文件graphics.h中定义。Gmode:整型值,用来设置图形显示模式。path:字符串,用来指明图形驱动程序所在路径。注:前两个参数实际上是整型指针,调用时应加上地址运算符“&”。第10页,课件共101页,创作于2023年2月(1)已知显示器类型的图形系统初始化例7.1#include“graphics.h”main(){intgdriver,gmode;gdriver=CGA;/*设置显示器为CGA*/gmode=CGACO;/*选用CGA图形模式*/initgraph(&gdriver,&gmode,“c:\\TC”)/*初始化图形系统*/bar3d(10,20,50,80,0,0);/*画一实心长方形*/getch(); /*等待按一键结束*/closegraph();/*关闭图形系统,回到文本方式*/}第11页,课件共101页,创作于2023年2月(2)不知显示器类型的初始化TurboC提供了一个对图形显示器硬件测试的函数detectgraph()。它的格式为:
voidfardetectgraph(int*gdriver,int*gmode)该函数在计算机有图形适配器的情况下,确定图形适配器的类型,若系统由图形适配器,则返回适合于适配器的图形驱动程序的代码,用gdriver指向的整型量表示,该函数把gmode所指的变量设置为适配器所能支持的最高分辨率。若系统无图形适配器,则gdriver所指变量为–2。第12页,课件共101页,创作于2023年2月例7.2#include“stdio.h”#include“graphics.h”main(){intgdriver,gmode;detectgraph(&gdriver,&gmode) /*测试硬件结果存放于gdriver,gmode中*/if(gdriver<0){printf(“thereisnotgraphicsdisplager\n”);
exit(1)} /*无图形显示器时,提示信息,停止程序*/printf(“detectgraphicsdriveris#%d,modeis#%d\n,”gdriver,gmode);
/*显示硬件测试结果*/getch(); /*等待按一键*/initgraph(&gdriver,&gmode,“c:\\tc”);/*初始化*/bar3d(10,20,50,80,0,0); /*画实心长方形*/getch(); /*等待按一键结束*/closegraph(); /*关闭图形系统,回到文本方式*/}第13页,课件共101页,创作于2023年2月(3)自动初始化图形系统规定gdriver=DETECT,则initgraph()函数会自动按照系统所配置的图形显示器来确定驱动程序,并把图形模式设置为驱动程序的最高分辨率,实现图形系统初始化。例7.3#include“graphics.h”main(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,“c:\\tc”);/*初始化*/bar3d(10,20,50,80,0,0); /*画实心长方形*/getch(); /*等待按一键结束*/closegraph();/*关闭图形系统,回到文本方式*/}第14页,课件共101页,创作于2023年2月图形系统的关闭在程序结束前用函数closegraph()关闭图形系统,以释放图形驱动程序所占用的空间,使系统回到文本模式。关闭图形系统函数格式为:
voidfarclosegraph();第15页,课件共101页,创作于2023年2月图形模式的控制
TurboC都提供了如下函数控制图形模式:(1)返回当前图形模式值
intfargetgraphmode(void);(2)恢复屏幕在图形初始化前模式
voidfarrestorectmode(void);(3)设置系统图形模式并清屏幕
voidfarsetgraphmode(intgmode);(4)获取图形驱动器可使用的模式范围
voidfargetmoderange(intdriver,int*lomode,int*himode)
该函数确定由driver所指定图形驱动器能够支持的最低和最高模式,并且把这些值放在由lomode和himode所指向变量中。第16页,课件共101页,创作于2023年2月例7.4#include“stdio.h”#include“graphics.h”main(){intgdriver,gmode,lo,hi;gdriver=CGA; /*设置CGA的图形驱动程序*/getmoderange(CGA,&lo,&hi); /*获得CGA的图形模式范围*/printf(“CGAsupportingmodesrangefrom%dto%d\dn”,lo,hi); /*显示CGA显示模式范围*/initgraph(&gdriver,&lo,“c:\\tc”); /*初始化为CGAC0*/bar3d(10,20,50,80,0,0); /*画实心长方形*/getch(); /*等待按一键结束*/gmode=getgraphmode();/*获得当前图形模式*/restorecrtmode(); /*返回图形初始化前的显示模式*/printf(“Nowintextmode,pressanykeybacktographicsmode.\n”);getch();setgraphmode(gmode);/*再回到图形模式*/rectangle(50,30,100,130);/*画一长方形*/getch();closegraph(); /*关闭图形系统*/}第17页,课件共101页,创作于2023年2月7.1.4图形坐标的设置
定点(1)把当前游标移到所需的位置,即(x,y)点
voidfarmoveto(intx,inty);此函数把当前窗口中的当前游标位置(cp)移到所需的(x,y)位置(不是画)。(2)以增量方式移动当前游标
voidfarmoverel(intΔx,intΔy)
此函数把当前窗口中的当前游标位置(cp)移到所需的(x+Δx,y+Δy)位置。第18页,课件共101页,创作于2023年2月7.1.4图形坐标的设置
读取当前游标位置(1)intfargetx(void);
此函数返回游标在x轴的位置。(2)intfargety(void);
此函数返回游标在y轴的位置。例如,下列语句显示游标当前位置的值
printf(“cp’sloc:%d%d”,getx(),gety());第19页,课件共101页,创作于2023年2月7.1.4图形坐标的设置(1)intfargetmaxx(void);
此函数返回x轴的最大值(2)intfargetmaxy(void);
此函数返回y轴的最大值第20页,课件共101页,创作于2023年2月例7.5
显示系统中图形硬件支持的最大的x,y值。#include“stdio.h”#include”graphics.h”main(){intgdriver,gmodegdriver=CGAC0;initgraph(&gdriver,&gmode,””);printf(“maxx,yis%d,%d”,getmaxx(),getmaxy());getch();restorecrtmode();}输出结果为:maxx,yis319,199第21页,课件共101页,创作于2023年2月例7.6画一“干”字。#include”graphics.h”main(){intgdriver=DETECT,gmode;intx,y;initgraph(&gdriver,&gmode,””);cleardevice();moveto(100,40);linerel(40,0);x=getx();y=gety();moveto(x+10,y+30); linerel(-60,0);moverel(30,-30);linerel(0,60);getch();closegraph();}输出结果如图所示154632第22页,课件共101页,创作于2023年2月7.1.5屏幕窗口操作
在图形模式下,主要是绘制图形,为有效地对图形进行操作,TurboC提供如下处理功能:图形屏幕图形窗口即TurboC在图形模式下开设“窗口”(也称为视图区),并对屏幕和图形进行处理。第23页,课件共101页,创作于2023年2月图形屏幕和图形窗口第24页,课件共101页,创作于2023年2月图形屏幕处理
(1)清除图形屏幕voidfarcleardevice(void);
此函数是清除整个图形屏幕(但保留底色),并把当前游标位置(CP)重新设置为(0,0)。例7.7#include“graphics.h”main(){ intgdriver,gmode;gdriver=CGA;gmode=CGACOinitgraph(&gdriver,&gmode,””);cleardevice();bar3d(10,20,50,180,0,0);getch();closegraph();}第25页,课件共101页,创作于2023年2月图形屏幕处理
(2)设置图形输出活动页
voidfarsetactivepage(intpage);该函数确定接受图形函数所输出活动页,缺省值为屏幕显示0页。保存显示在屏幕上信息的RAM称为页(Page)。如果你把图形输出到其他屏幕显示页,这些页未必马上显示出来,Page为活动页的值。在图形模式中,只有EGA和VGA支持多图形页,但这些图形卡也不是所有模式都支持多图形页。例如,下列语句1页为活动页:
Setactivepage(1);第26页,课件共101页,创作于2023年2月图形屏幕处理
(3)设置可见图形页号
voidfarSetvisualpage(intpage);该函数显示page所指定的可见图形页。例如,下列语句选择显示第1页:
Setvisualpage(1);第27页,课件共101页,创作于2023年2月例7.8#include“graphics.h”main(){intgdriver,gmode; gdriver=VGA; /*设置VGA图形适配器*/gmode=VGAHI;/*设置VGA图形模式*/initgraph(&gdriver,&gmode,””);/*图形系统初始化*/cleardevice();/*清光屏*/setactivepage(1);/*设置图形输出活动页为1*/circle(150,130,80);/*画一个圆*/setactivepage(0);/*置图形活动页为0*/rectangle(40,160,90,180);/*画一个矩形*/getch();setvisualpage(1);/*设置可见图形1页*/getch();setvisualpage(0);/*设置可见图形0页*/getch();closegraph();/*关闭图形系统*/}
这段程序先在屏幕的1号页面和0号页面画一个圆和一个矩形,然后用setvisualpage函数进行页面变换显示。第28页,课件共101页,创作于2023年2月屏幕窗口操作清除当前图形窗口voidfarclearviewport(void);
该函数清除当前图形窗口,并把当前游标位置(CP)重置为(0,0)。设置图形窗口voidfatsetviewport(intleft,intright,intbottom,intclipflag);
该函数是建立一个新的图形窗口,窗口大小设置是用左上角坐标left、top与右下角坐标right、bottom来定义的。若clipflag为1,则超出窗口的输出自动剪裁掉;若clipflag为0,则图形窗口之外不被剪裁。第29页,课件共101页,创作于2023年2月例7.9
窗口设置与清除作用#include”graphics.h”main(){intgdriver=CGA,gmode=0;initgraph(&gdriver,&gmode,””);rectangle(30,25,80,80);/*画一个矩形*/setviewport(30,25,80,80,0);/*设置窗口,其大小与前面所画图形,窗口之外不剪裁*/line(0,0.100,150);/*画直线*/getch();clearviceport();/*清除窗口*/getch();cleardevice();/*清屏*/getch();setviewport(20,15,80,80,1);/*重置窗口,窗口之外剪裁*/rectangle(0,0,60,65);/*画一矩形*/line(0,0,100,150);/*画直线*/getch();closegraph();}第30页,课件共101页,创作于2023年2月7.2图形颜色设置前景色:构成字符和图形点的颜色背景色:整个显示屏颜色本节主要内容:7.2.1颜色设置7.2.2调色板7.2.3读取颜色信息包括对当前背景颜色的设置和对当前画图颜色的设置第31页,课件共101页,创作于2023年2月7.2.1颜色设置
设置当前背景颜色
voidfarsetbkcolor(intcolor);
注:参数color可以用颜色的名字,也可以用数字,它们对应关系在graphics.h中定义。缺省时,默认值为0,即黑色。例如,若要把背景设置为红色,可以这样写:setbkcolor(RED);或setbkcolor(4);
关于背景色名称和数值的对应关系,请见下一页的表格
第32页,课件共101页,创作于2023年2月表7-3背景色名称和数值的对应关系符号常量数值含义BLACK0黑色BLUE1蓝色GREEN2绿色CYAN3青色RED4红色MAGENTA5洋色BROWN6棕色LICHTGRAY7浅灰DARKGRAY8深灰LIGHTBLUE9浅蓝LIGHGREEN10浅绿LIGHTCYAN11浅灰LIGHTRED12浅红LIGHTMAGENTA13浅洋红YELLOW14黄色WHITE15白色第33页,课件共101页,创作于2023年2月例7.10画一图,把背景颜色设置为淡灰色。#iinclude”graphics.h”main(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,"");setbkcolor(LIGHTGRAY);/*设置背景色为淡灰*/画图语句getch();restorecrtmode();/*将屏幕模式恢复为initgraph函数前面的设置*/}第34页,课件共101页,创作于2023年2月7.2.1颜色设置设置当前画图颜色voidfarsetcolor(intcolor);注:实际对应的颜色和调色板有关。缺省时,默认值是白色。例7.11
将画笔设置为绿色,画一圆,半径=40个像素距离,圆心位于(220,200)处。#include"graphics.h"main(){intgdriver,gmode;gdriver=EGA;gmode=EFAHI;initgraph(&gdriver,gmode,"");setcolor(GREEN);/*设置画笔色为绿色*/circle(220,200,40);/*画一圆*/getch();closegraph();}back第35页,课件共101页,创作于2023年2月7.2.2调色板
设置当前画笔色与调色板有关,对应一个显示设备可能有多个调色板,这意味着尽管硬件能够显示多种颜色,但由于同一时间内只能有一个调色板,所以在同一时间内只有显示设备可能显示总颜色的一个子集可以被显示出来,因为调色板内颜色的数目受到可用视频内存的限制。根据颜色控制方法不同,可以把支持的颜色屏幕划分为两类:一类是CGA,包括CGAHI、MCGAMED、MCGAHI、ATT400MED、ATT400HI;另一类是EGA和VGA适配器。第36页,课件共101页,创作于2023年2月1.CGA调色板CGA类屏幕有两种分辨率:低分辨率和高分辨率。低分辨率方式显示320*200个像素点,4种颜色;高分辨率方式显示640×200个像素点,只有两种颜色。在CGA低分辨率方式下,可以显示的4种颜色由选择的调色板决定。在CGA方式下可以使用的调色板有CGAC0、CGAC1、CGAC2和CGAC3。每种CGA调色板均含有4种不同颜色,见下表所示。调色板不同所包含的颜色也不一样。每种调色板只能使用与它列在同一行中的颜色,其编号依次为0、1、2、3,也可以使用符号常量。表中调色板号是图形方式,而颜色0是背景色,颜色1、2、3是像素点颜色。调色板在initgraph函数中设置,颜色用setcolor函数设置。第37页,课件共101页,创作于2023年2月调色数赋予点的颜色0123
C0背景浅绿浅红黄
C1背景浅青浅洋红白
C2背景绿红黄
C3背景青洋红浅灰CGA的色调符号常数第38页,课件共101页,创作于2023年2月符号常量数值含义BLACK0黑色BLUE1蓝色GREEN2绿色CYAN3青色RED4红色MAGENTA5洋色BROWN6棕色LICHTGRAY7浅灰DARKGRAY8深灰LIGHTBLUE9浅蓝LIGHGREEN10浅绿LIGHTCYAN11浅灰LIGHTRED12浅红LIGHTMAGENTA13浅洋红YELLOW14黄色WHITE15白色CGA方式低分辨率下的背景色和高分辨率下的前景色EGA的前景色第39页,课件共101页,创作于2023年2月例如:
intgdriver,gmode;
gdriver=CGA;
gmode=CGAC1;
initgraph(&gdriver,&gmode,“”);
……setcolor(CGA-WHITE);
……
该例使用图形驱动程序CGA,调色板CGAC1,颜色CGA-WHITE(白色),上述颜色设置语句也可以写为:
Setcolor(3);在CGA高分辨率方式下,只显示两种颜色:黑色背景和彩色前景。像素值可为0或1,当像素值为0时,其像素点为黑色(背景色);如果像素点值为1,由于CGA本身原因,前景色就是硬件所认为的背景色,可用setbkcolor设置,前景色可选用表7-3所列的颜色。第40页,课件共101页,创作于2023年2月例7.12
在高分辨率下画一蓝色图。
#include“graphics.h”main()
{intgdriver=CGA,gmode=CGAHI;
initgraph(&gdriver,&gmode,“”)’
cleardevice();
setbkcolor(BLUE);
circle(160,100,50);
circle(160,100,25);
getch();
closegraph();
}
程序执行后,在黑色屏幕上显示蓝色圆图形。第41页,课件共101页,创作于2023年2月2.EGA调色板
对EGA来说,总共可以有64种颜色只有一个调色板,但这个调色板只有16项,可同时显示16种颜色。在缺省情况下,EGA调色板中颜色与CGA中背景色相同。如下表(7-4)所示,在前景色上增加了“EGA-”,颜色号也不一样。
表7-4符号常量数值含义EGA-BLACK0EGA黑色EGA-BLUE1EGA蓝色EGA-GREEN2EGA绿色EGA-CYAN3EGA青色EGA-RED4EGA红色EGA-MAGENTA5EGA洋色第42页,课件共101页,创作于2023年2月符号常量数值含义EGA-BLACK0黑色EGA-BLUE1蓝色EGA-GREEN2绿色EGA-CYAN3青色EGA-RED4红色EGA-MAGENTA5洋色EGA-BROWN20棕色EGA-LIGHTGRAY7浅灰EGA-DARKGRAY56深灰EGA-LIGHTBLUE57浅蓝EGA-LIGHGREEN58浅绿EGA-LIGHTCYAN59浅灰EGA-LIGHTRED60浅红EGA-LIGHTMAGENTA61浅洋红EGA-YELLOW62黄色EGA-WHITE63白色EGA前景色对照表第43页,课件共101页,创作于2023年2月3.改变调色板的一种颜色
voidfarsetpalette(intoldcolor,intnewcolor);此函数改变屏幕系统所显示颜色。它把调色板oldcolor变为newcolor。对于CGA模式,只有背景色能改变,而背景色总是取oldcolor=0,例如,下列语句可把背景色改成绿色:
setpalette(0,GREEN);对于EGA模式可以用setpalette()函数将某一种颜色设置为16种不同颜色中的一种。Oldcolor是表7-3中任一颜色,而newcolor是表7-4中任一颜色。例如:
Setpalette(BLUE,EGA-GREEN)。或setpalette(1,2);将屏幕上的蓝色(BLUE)均变为绿色(EGA-GREEN)。back第44页,课件共101页,创作于2023年2月7.2.3读取颜色信息
1.读取当前背景颜色intfargetbkcolor(void);2.读取当前画图颜色intfargetcolor(void);3.可用颜色数intfargetmaxcolor(void);注:该函数返回当前屏幕模式下最大有效颜色值。在EGA模式下,getmaxcolor()函数返回最大值为15,这表明用setcolor()函数值在0~15有效。
第45页,课件共101页,创作于2023年2月7.2.3读取颜色信息4.在点(x,y)处画一规定颜色点
Voidfarputpixel(intx,inty,intcolor);此函数把color所指定的颜色写到(x,y)处的像素上。
问:Putpixel(10,20,GREEN);表示什么意思?5.点(x,y)的颜色
intfargetpixel(intx,inty);此函数返回指定点(x,y)位置上的像素颜色。
问:color=getpixel(10,20);表示什么意思?第46页,课件共101页,创作于2023年2月例7.13
在不同位置画点。#include“graphics.h”main(){intgdriver=DELECT,gmode;intcolor,i,max;initgraph(&gdriver,&gmode,””);max=getmaxcolor();for(i=0;i<20;i++)putpixel(50+i*10,20,max);color=getpixel(50,20);putpixel(150,150,color);getch();closegraph();}back第47页,课件共101页,创作于2023年2月7.3线的特性设定和填充
7.3.1线的特性设定TurboC提供了可以改变线型和线宽的函数:Voidfarsetlinestyle(intlinestyle,unsignedpattern,intwidth);7.3.2填充
填充模式和颜色设置漫延填充第48页,课件共101页,创作于2023年2月7.3.1线的特性设定用画线函数进行画线时,其默认值为一像素点宽度的实线;可用下面的函数改变线型和线宽:
voidfarsetlinestyle(intlinestyle,unsignedpattern,intwidth);参数含义如下:(1)linestyle:整数值,用来定义所画直线类型。(2)pattern:无符号整型数。该参数为需要用户自定义线型时使用,如果是使用前四种系统预定义的线型,则该参数可取0值。(3)width:整型数。指定所画直线的粗细,以像素为单位,分为两种情况。第49页,课件共101页,创作于2023年2月Linestyle和width参数的对照表代号名代码说明SOLID-LINE0实线DOTTEN-LINE1点线CENTER-LINE2中心线DASHED-LINE3虚线USERBIT-LINE4用户定义的线型符号常量值含义NORM-WIDTH11个像素宽(缺省)THICK-WIDTH33个像素宽第50页,课件共101页,创作于2023年2月7.3.1线的特性设定若函数的第一个参数为USERBIT-LINE(或4)时,由用户自己定义直线类型。此时,第三个参数意义同前,第二个参数中定义直线类型,该参数是一个16位二进制代码,每一位(bit)表示一个像素。某一位置1时表示直线上相应位置以当前颜色显示;如果某位为0,则其相应像素不显示或不改变(仍用原来颜色)。
例如:111111111111111116位全置1,因此画一条16个像素的点实线。而:1010101010101010
则隔位置1,因此画一条16个像素的点虚线。在实际编写程序时,一般把每4位二进制数转换为1位十六进制数,故上面两个例子转换为十六进制数为:FFFF和AAAA。函数调用方法为:setlinestyle(4,0XAAAA,1);第51页,课件共101页,创作于2023年2月
EBAE1110101110101110如何自定义线型
setlinestyle(4,oxEBAE,1)第52页,课件共101页,创作于2023年2月例7.14演示系统预定义的四种线型#include<graphics.h>main(){intI,j,c,x=50,y=50,k=1;intgdriver=DELECT,gmode;printf(“inputcolornumber.\n”);scanf(“%d”,&c);initgraph(&gdriver,&gmode,”c:\\tc”);cleardevice();setbkcolor(11);setcolor(I);for(j=1;j<=2;j++){for(I=0;I<4;I++){setlinestyle(I,o,k);rectangle(x,y,x+210,y+80);x=x+110;y=y+40;}k=3;x=50;y=250;}getch();closegraph();}back第53页,课件共101页,创作于2023年2月7.3.2填充填充模式和颜色设置:封闭区域的填充,需要设置当前填充模式和填充颜色,函数原型:voidfarsetfillstyle(intpattern,intcolor);参数pattern用于指定填充模式,取值12种(其对照表见下一页)。参数color是指定填充用颜色,取值必须是当前屏幕模式的有效值。缺省填充模式为SOLID-FILL,填充颜色为getmaxcolor函数返回值(一般为白色)。第54页,课件共101页,创作于2023年2月符号值含义EMPTY-FILL0用背景颜色填充SOLID-FILL1实填充LINE-FILL2用线填充LTSLASH-FILL3用斜杠填充(阴影线)SLASH-FILL4用粗斜杠填充(粗阴影线)BKSLASH-FILL5用粗反斜杠填充(粗阴影线)LTBKSLASH-FILL6用反斜杠填充(阴影线)HATCH-FILL7网络线填充XHATCH-FILL8斜网格线填充INTERLEAVE-FILL9隔点填充WIDE-DOT-FILL10稀疏点填充CLOSE-DOT-FILL11密集点填充USER-FILL12用户定义的模式填充模式代号第55页,课件共101页,创作于2023年2月例7.15画一个二维和三维条形并填图#include“graphics.h”main(){inti,gdriver=DETECT,gmode;initgraph(&gdriver,&gmode,“”);setfillstyle(SOLD-FILL,CYAN);bar(90,100,150,200);setfillstyle(SOLD-FILL,MAGENTA);bar3d(200,100,250,200,200,10,1);getch();closegraph();}back第56页,课件共101页,创作于2023年2月7.3.2填充漫延填充
voidfarfloodfill(intx,inty,border);该函数用来填充一块有界的封闭区域,(x,y)是待填充区域的起点,border指定填充区域边界所使用颜色。如果起点在封闭区域内,则区域内部被填充;如果起点在封闭区域外,则区域外部被填充。用floodfill填充时,使用的是当前填充模式的填充颜色,也可以通过setfillstyle来改变设置。第57页,课件共101页,创作于2023年2月Setcolor(BLUE);Setfillstyle(SOLID-FILL,RED);Floodfill(150,200,BLUE);第58页,课件共101页,创作于2023年2月Setcolor(BLUE);Setfillstyle(SOLID-FILL,RED);Floodfill(50,20,BLUE);第59页,课件共101页,创作于2023年2月Setcolor(BLUE);Setfillstyle(SOLID-FILL,RED);Floodfill(50,20,BLUE);第60页,课件共101页,创作于2023年2月例7.16填充一个封闭圆
#include“graphics.h”main(){intgdriver,gmode;gdriver=VGA;gmode=VGAHI;initgraph(&gdriver,&gmode,“”);setbkcolor(1);/*定背景色*/setcolor(4);/*定画笔色*/circle(100,100,80);/*画一个圆*/setfillstyle(SLASH-FILL,2);/*定填充模式和填充色*/floodfill(100,100,4);/*填充一个封闭圆*/getch();closegraph();}back第61页,课件共101页,创作于2023年2月7.4图形模式下文本处理
为了在图形模式下对文本进行操作,TurboC提供了对图形进行字符串输出,以及对输出字符的字号进行控制等有关文本输出函数。本节主要介绍:7.4.1图形模式下文本处理设置7.4.2文本输出函数7.4.3输出文本的设置第62页,课件共101页,创作于2023年2月7.4.1图形模式下文本处理设置(1)将屏幕设置成文本模式voidtextmode(intmode);textmode选择一个指定的文本模式。通过使用枚举型text_modes的符号常量(在CONIO.H中定义)给出文本模式(参数mode)。使用这些常量时,必须使用#include<conio.h>。第63页,课件共101页,创作于2023年2月text_modes类型的符号常量、数值和所指定的模式
符号常量数值文本模式LASTMODE-1原文本模式BW400黑白,40列C401彩色,40列BW402黑白,80列C803彩色,80列MONO7单色,80列C435064EGA43行和VGA50行模式第64页,课件共101页,创作于2023年2月7.4.1图形模式下文本处理设置(2)选择新的文本颜色
voidtextbackground(intcolor);——定义背景文本颜色
voidtextcolor(intcolor);——定义前景文本颜色这些函数影响调用该函数后用直接由控制台输出(如cprintf)显示的字符。对于textbackground,color是从0到7的一个整型数;对于textcolor,则是一个从0到15的整型数。可以用定义在CONIO.H中的符号常量来给出颜色,此时必须使用#include<conio.h>。第65页,课件共101页,创作于2023年2月BLACK0两者BLUE1两者GREEN2两者CYAN(青色)3两者RED4两者MAGENTA(洋红)5两者BROWN(棕色)6两者LIGHTGRAY(洋灰)7两者DARKGRAY(深灰)8前景LIGHTBLUE9前景LIGHTGREEN10前景LIGHTCYAN11前景LIGHTRED12前景LIGHTMAGENTA(浅洋红)13前景YELLOW14前景WHITE15前景BLINK128前景conio.h中允许使用的颜色、值,及其在前景与背景下有效情况第66页,课件共101页,创作于2023年2月7.4.1图形模式下文本处理设置(3)Textattr设置文本属性用法 voidtextattr(intattribute);原型在 conio.h中说 明调用textattr,一次就可设置前景和背景颜色(一般要用textcolor和textbackground设置它们)。本函数不影响当前屏幕上的任何字符,它只是影响调用该函数后用直接控制台输出函数(如cprintf)显示的字符。第67页,课件共101页,创作于2023年2月颜色信息在attribute参数中的编码如下:76543210Bbbbffff在这个8位的参数attribute中:ffff是4位前景颜色(0到15)bbb是3位背景颜色(0到7)B是闪烁允许位如果闪烁允许位打开(为on),字符将会闪烁。这可以通过把属性加上BLINK来实现。如果使用在CONIO.H中定义的符号颜色常量,通过textattr来建立文本属性,请注意背景颜色选择的如下一些限制:只能为背景选择前八种颜色之一。必须将所选的背景颜色左移4位,以使得3位背景色移到正确的位置上。back第68页,课件共101页,创作于2023年2月7.4.2文本输出函数
1.把一字符串输出至屏幕当前位置
voidfarouttext(char*textstring);
此函数在当前位置上输出一字符串。参数textstring是一个文本字符串。如果当前方向是水平的,则游标位置移动量为该字符串的长度,否则游标位置不变。在图形模式下,游标是看不见的,但游标位置是存在的。例如:
outtext(“thisisastring”);
将在当前位置输出字符串“thisisastring”第69页,课件共101页,创作于2023年2月7.4.2文本输出函数2.在屏幕指定位置上输出一字符串
voidfarouttextxy(intx,inty,char*textstring);该函数在指定位置(x,y)处输出字符串textstring。例如:outtextxy(70,100,“Thisisastring”);将在(70,100)处输出字符串“Thisisastring”。第70页,课件共101页,创作于2023年2月7.4.2文本输出函数3.格式化输出函数TurboC提供的格式化输出函数sprintf可以在图形方式下输出数值或其他类型资料。
sprintf(*str,*format,variable-list);这里str是字符串(字符数组),是格式化字符串,variable-list是变量列表。该函数功能是把要输出信息写入由所指向的字符串中。例如:charstr[80];sprintf(str,“%s%d%c”,”one”,2,3);
执行后字符串str的内容为one,2,3,。sprintf的原型在头文件stdio.h中。因此它并不是一个图形函数。在图形形式下并不直接使用该函数,而是使用由它产生的结果,即字符串值,这个字符串中可以含有多种类型资料。有了这样字符串,再用outtext或outtextxy输出其内容,就能满足各种需要。back第71页,课件共101页,创作于2023年2月7.4.3输出文本的设置
1.文本字体、方向和大小为了使用笔画字体,必须装入字体文件。这可通过settextstyle函数来实现。
voidfarsettextstyle(intfont,intdirection,intcharsize);
此函数是设置当前位置输出文本字体,显示方向和字符大小。函数共有三个参数,其含义如下:(1)direction:是一个整型数,用来指定文本输出方向,其取值如下一页表1所示。(2)Font:是一个整形数,用来指定所使用字体,其取值如下一页表1所示。(3)charsize:是一个整型数,该参数实际上是一个因子,它表示8*8点阵字符号的放大倍数,既影响点阵字符,也影响笔画字体。其取值如下一页表2所示。第72页,课件共101页,创作于2023年2月表2direction符号常量取值说明HORIZ-DIR0从左到右(缺省值)
VERT-DIR1从上到下表1font名字值含义DEAFAULT-FONT08*8的点阵(8*8bit字体)TRIPLEX-FONT1笔画三重型字(粗体字)SMALL-FONT2笔画小型字(细铅字体)SANS-SERIF-FONT3笔画无衬线字(非细铅字体)GOTHIC-FONT4笔画粗黑字(哥德体字体)第73页,课件共101页,创作于2023年2月符号常数字符大小符号常数字符大小18×8点阵756×56点阵216×16点阵864×64点阵324×24点阵972×72点阵432×32点阵1080×80点阵540×40点阵USER-CHAR-SIZE(0)用户自定义字符大小648×48点阵表3charsize第74页,课件共101页,创作于2023年2月例7.19#include“graphics.h”Main(){intgdriver,gmode;gdriver=EGA;gmode=EGAHI;initgraph(&gdriver,&gmode,””);setbkcolor(4);/*红色*/setcolor(1);/*蓝色*/settextstyle(TRIPLEX-FONT,HORIZ-DIR,2);outtextxy(10,10,”It’sademo:times=2”);/*三倍笔画,从左到右显示,放大值为2,即16*16点阵*/settextstyle(TRIPLEX-FONT,HORIZ-DIR,4);outtextxy(10,30,”It’sademo:times=4”);/*三倍笔画,从左到右显示,放大值为4*/settextstyle(GOTHIC-FONT,HORIZ-DIR,6);outtextxy(10,80,”It’sademo:times=6”);/*黑体笔画,从左到右显示,放大值为6*/getch();closegraph();}第75页,课件共101页,创作于2023年2月
放大值分别为2,4,6时显示的图形第76页,课件共101页,创作于2023年2月7.4.3输出文本的设置2.设置文本对齐方式
voidfarsettextjustify(inthoriz,intvert);规定文本在水平和垂直方向上的输出方式。参数horiz和vert是整型数,其取值见下页的表格。其中第一个参数确定水平方向的对齐位置,第二个参数确定垂直方向的对齐位置。两个参数取不同值,就能确定其中一个位置。第77页,课件共101页,创作于2023年2月horiz和vert的取值
方向符号向量值功能含义水平LEFT-TEXT0光标在左边,从左往右(默认)CENTER-TEXT1光标在中间,从中心往两边RIGHT-TEXT2光标在右,从右向左垂直BOTTOM-TEXT3光标在下,从下向上CENTER-TEXT1光标在中间,从中心往两边TOP-TEXT4光标在上,从上向下(默认)第78页,课件共101页,创作于2023年2月例如:
settextjustify(LEFT-TEXT,TOP-TEXT);
所确定位置在文本字符串的左上角。在这以后,当用outtextxy函数输出字符串时,这个位置就对准函数中的(x,y)位置。如下图所示。
CENTERLEFT,TOPCENTER,TOPRIGHT-TOP
LEFT,CENTERLEFT,BOTTOMCENTER,BOTTOMRIGHT,BOTTOMRIGHT,CENTER第79页,课件共101页,创作于2023年2月图中方块表示需要输出的字符串。两个参数不同组合指定了字符串不同位置,当用outtextxy函数输出该字符串时,(x,y)指的就是这个位置。例如,执行settextjustify(RIGHT-TEXT,BOTTOM-TEXT);后,若执行
outtextxy(100,200,”AAAAAAAAAAAA”);
则(100,120)指的是所输出字符串右下角。在缺省情况下,对齐方式是LEFT-TEXT,TOP-TEXT,如果用outtextxy输出上面字符串,则(100,120)指的是字符串左上角。第80页,课件共101页,创作于2023年2月7.4.3输出文本的设置3.返回字符串的高度和宽度(以像素为单位)#include<graphics.h>intfartextheight(charfar*textstring);intfartextwidth(charfar*textstring);textheight返回以像素为单位的字符串高度,textwidth返回以像素为单位的字符串宽度。用textheight和textwidth来计算字符串的高度和宽度而不是自己编代码来计算是非常重要的。因为通过使用这些函数后,即使选择了不同的字体,也不需要修改源代码。用途:调整两行之间的距离大小、计算视区的高度和宽度、确定一个标题尺寸使其放在图形或方框中的合适位置。第81页,课件共101页,创作于2023年2月7.4.3输出文本的设置4.改变向量字体宽度和高度
voidfarsetusercharsize(intmultx,intdivx,intmulty,intdivy);
此函数设置了用户定义的笔画字型放大系数,x,y方向的放大系数分别为multx/divx,mul-ty/divvy,调用setusercharsize()函数之后,每个显示在屏幕上的字型都以缺省值大小乘以multx/divx为字符宽,乘以multy/divvy为字符高。这种方式只是在settextstyle()函数中的charsize=0时才起作用。第82页,课件共101页,创作于2023年2月例7.20#include”graphics.h”main(){intgdriver=DETECT,gmode;initgraph(&gdriver,&gmode,””);outtext(“Normal”);settextstyle(TRIPLEX-FONT,HORIZ-DIR,USER-CHAR-SIZE);setusercharsize(5,1,5,1);outtext(“TRIPLEX-FONT”); getch();
restorecrtmode();}输出结果为:NormalTRIPLEX-FONT
back
第83页,课件共101页,创作于2023年2月7.5图形存取处理
在图形方式下,图形存取有着重要作用,这也是图形动画的基础。图形存取的基本原理是:把屏幕上某个区域的信息存入一个缓冲区,然后在另一个区域把它的内容显示出来。本节主要内容:7.5.1检测所需内存7.5.2图形存入内存7.5.3从内存复制图形到屏幕第84页,课件共101页,创作于2023年2月7.5.1检测所需内存unsignedfarimagesize(intx1,inty1,intx2,inty2);该函数返回一个无符号整数值,它是存储图形所需的字节数。参数x1,y1,x2,y2均为整型数,用来确定要存储的屏幕区域。这个区域是一个矩形,其左上角坐标为(x1,y1),右下角坐标为(x2,y2)。例如执行
unsignedsize;
size=imagesize(10,10,100,100);将把存储左上角为(10,10),右下角为(100,100)的矩形区域所需的内存字节数存入变量size中。注:存储屏幕区域所需的字节数最多不能超过64K–1个字节,否则返回值为−1(0×FFFF)。也就是说,图形存取限制在64K(216)字节之内。back第85页,课件共101页,创作于2023年2月7.5.2图形存入内存voidfargetimage(intx1,inty1,intx2,inty2,void*bitmap);该函数将指定区域的图形从屏幕拷贝到内存区域。要复制的屏幕区域由左上角(x1,y1)和右下角(x2,y2)给出,它应当与imagesize函数中参数相同。Bitmap是一个void类型指针,需要复制的屏幕区域将保存在由它所指向的数组中。例如:void*w;unsignedsize;size=imagesize(10,10,100,100);w=malloc(size);getimage(10,10,100,100,w)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论