C语言图形编程.docx
- 文档编号:26502519
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:15
- 大小:57.35KB
C语言图形编程.docx
《C语言图形编程.docx》由会员分享,可在线阅读,更多相关《C语言图形编程.docx(15页珍藏版)》请在冰豆网上搜索。
C语言图形编程
ItwaslastrevisedonJanuary2,2021
C语言图形编程
C的图形编程
一、屏幕显示模式
1、文本模式
在文本模式又称字符模式。
在此模式下整个屏幕被划分成(25行,80列),共25*80个文本单元,每个单元包括一个字符和一个属性,字符即ASCII码字符,属性规定该字符的颜色和强度。
坐标原点在屏幕的左上角。
如下图所示:
在<>头文件中定义了文本模式下一些函数常用的有;
(1)定义一个文本窗口
voidwindow(intleft,inttop,intright,intbottom);
如要定义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗口可写成:
window(20,5,50,25);
(2)文本窗口颜色的设置voidtextbackground(intcolor);有关颜色的定义
━━━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数数值含义字符或背景
───────────────────────────
BLACK0黑两者均可
BLUE1兰两者均可
GREEN2绿两者均可
CYAN3青两者均可
RED4红两者均可
MAGENTA5洋红两者均可
BROWN6棕两者均可
LIGHTGRAY7淡灰两者均可
DARKGRAY8深灰只用于字符
LIGHTBLUE9淡兰只用于字符
LIGHTGREEN10淡绿只用于字符
LIGHTCYAN11淡青只用于字符
LIGHTRED12淡红只用于字符
LIGHTMAGENTA13淡洋红只用于字符
YELLOW
14黄只用于字符
WHITE15白只用于字符
BLINK128闪烁只用于字符━━━━━━━━━━━━━━━━━━━━━━━━━━━
例2:
捕获键盘按键。
键盘扫描码:
每个键都有一个两字节的扫描码,其格式:
#defineESC0x011B
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4B00
#defineRIGHT0x4D00
#defineENTER0x1C0D
在头文件<>中定义如下函数,用以捕获键盘按键。
intbioskey(intmode);h[1],k.ch[0]);
}
}
例3:
C提供的随机函数:
voidrandomize();
图形驱动器、模式的符号常数及数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图形驱动器(gdriver)图形模式(gmode)
──────────────────────
色调分辨率
符号常数数值符号常数数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CGA1CGAC00C0320*200
CGAC11C1320*200
CGAC22C2320*200
CGAC33C3320*200
CGAHI42色640*200───────────────────────────────────
MCGA?
2MCGAC00C0320*200
MCGAC11C1320*200
MCGAC22C2320*200
MCGAC33C3320*200
MCGAMED42色640*200
MCGAHI?
52色640*480
───────────────────────────────────
EGA3EGALO016色640*200
EGAHI
116色640*350
───────────────────────────────────
EGA644EGA64LO016色640*200
EGA64HI14色640*350
───────────────────────────────────
EGAMON5EGAMONHI02色640*350
───────────────────────────────────
IBM85146IBM8514LO0256色640*480
IBM8514HI?
1256色1024*768
───────────────────────────────────
HERC7HERCMONOHI02色720*348
───────────────────────────────────
ATT4008ATT400C00C0320*200
ATT400C1?
1C1320*200
ATT400C2?
2C2320*200
ATT400C33C3320*200
ATT400MED42色320*200
ATT400HI52色320*200
───────────────────────────────────
VGA9VGALO016色640*200
VGAMED?
116色640*350
VGAHI?
216色640*480
───────────────────────────────────
PC327010PC3270HI02色720*350
───────────────────────────────────
DETECT0用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例子1:
使用图形初始化函数设置VGA高分辨率图形模式
#include<>
intmain()
{
intgdriver,gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,"c:
\\tc");基本图形函数
基本图形函数包括画点,线以及其它一些基本图形的函数。
本节对这些函数作一全面的介绍。
一、画点
1.画点函数voidfarputpixel(intx,inty,intcolor);
该函数表示有指定的象素画一个按color所确定颜色的点。
对于颜色color的值可从表3中获得而对x,y是指图形象元的坐标。
对VGA适配器,它的最高分辨率为640x480,屏幕的左上角坐标为(0,0),右下角坐标为(639,479),关于点的另外一个函数是:
intfargetpixel(intx,inty);
它获得当前点(x,y)的颜色值。
2.有关坐标位置的函数
intfargetmaxx(void);画线函数TURBOC提供了一系列画线函数,下面分别叙述:
voidfarline(intx0,inty0,intx1,inty1);画一条从点(x0,y0)到(x1,y1)的直线。
voidfarlineto(intx,inty);
画一从当前光标到点(x,y)的直线。
voidfarlinerel(intdx,intdy);
画一条从当前光标(x,y)到按相对增量确定的点(x+dx,y+dy)的直线。
voidfarcircle(intx,inty,intradius);以(x,y)为圆心,radius为半径,画一个圆。
voidfararc(intx,inty,intstangle,intendangle,intradius);以(x,y)为圆心,radius为半径,从stangle开始到endangle结束(用度表示)画一段圆弧线。
在TURBOC中规定x轴正向为0度,逆时针方向旋转一周,依次为90,180,270和360度(其它有关函数也按此规定,不再重述)。
voidellipse(intx,inty,intstangle,intendangle,intxradius,intyradius);以(x,y)为中心,xradius,yradius为x轴和y轴半径,从角stangle开始到endangle结束画一段椭圆线,当stangle=0,endangle=360时,画出一个完整的椭圆。
voidfarrectangle(intx1,inty1,intx2,inty2);以(x1,y1)为左上角,(x2,y2)为右下角画一个矩形框。
voidfardrawpoly(intnumpoints,intfar*polypoints);画一个顶点数为numpoints,各顶点坐标由polypoints给出的多边形。
polypoints整型数组必须至少有2倍顶点数个无素。
每一个顶点的坐标都定义为x,y,并且x在前。
值得注意的是当画一个封闭的多边形时,numpoints的值取实际多边形的顶点数加一,并且数组polypoints中第一个和最后一个点的坐标相同。
2.设定线型函数线型包括:
宽度和形状。
其中宽度只有两种选择:
一点宽和三点宽。
而线的形状则有五种。
在没有对线的特性进行设定之前,TURBOC用其默认值,即一点宽的实线。
下面介绍有关线型的设置函数。
voidfarsetlinestyle(intlinestyle,unsignedupattern,int
thickness);该函数用来设置线的有关信息,其中linestyle是线形状的规定,见表5。
表5.有关线的形状(linestyle)━━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值含义─────────────────────────SOLID_LINE0实线DOTTED_LINE1点线CENTER_LINE2中心线DASHED_LINE3点画线USERBIT_LINE4用户定义线━━━━━━━━━━━━━━━━━━━━━━━━━thickness是线的宽度,见表6。
表6.有关线宽(thickness)
━━━━━━━━━━━━━━━━━━━━━━━━━
符号常数数值含义
─────────────────────────
NORM_WIDTH1一点宽
THIC_WIDTH3三点宽
━━━━━━━━━━━━━━━━━━━━━━━━━
对于upattern,只有linestyle选USERBIT_LINE时才有意义(选其它线型,
uppattern取0即可)。
此进uppattern的16位二进制数的每一位代表一个象素,如果那位为1,则该象素打开,否则该象素关闭。
有关线型设定和画线函数的例子如下所示。
#include<>
#include<>
intmain()
{
intgdriver,gmode,i;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"");
setbkcolor(BLUE);
cleardevice();
setcolor(GREEN);
circle(320,240,98);
setlinestyle(0,0,3);
setcolor
(2);
rectangle(220,140,420,340);
setcolor(WHITE);
setlinestyle(4,0xaaaa,1);
line(220,240,420,240);
line(320,140,320,340);
getch();
closegraph();
return0;
}
(5)封闭图形的填充
填充就是用规定的颜色和图模填满一个封闭图形。
一、先画轮廓再填充
TURBOC提供了一些先画出基本图形轮廓,再按规定图模和颜色填充整个封闭图形的函数。
在没有改变填充方式时,TURBOC以默认方式填充。
下面介绍这些函数。
voidfarbar(intx1,inty1,intx2,inty2);确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模和颜色填充。
说明:
此函数不画出边框,所以填充色为边框。
voidfarbar3d(intx1,inty1,intx2,inty2,intdepth,int
topflag);当topflag为非0时,画出一个三维的长方体。
当topflag为0时,三维图形不封顶,实际上很少这样使用。
说明:
bar3d()函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。
voidfarpieslice(intx,inty,intstangle,intendangle,intradius);画一个以(x,y)为圆心,radius为半径,stangle为起始角度,endangle为终止角度的扇形,再按规定方式填充。
当stangle=0,endangle=360时变成一个实心圆,并在圆内从圆点沿X轴正向画一条半径。
voidfarsector(intx,inty,intstanle,intendangle,intxradius,intyradius);画一个以(x,y)为圆心分别以xradius,yradius为x轴和y轴半径,stangle为起始角,endangle为终止角的椭圆扇形,再按规定方式填充。
二、设定填充方式
TURBOC有四个与填充方式有关的函数。
下面分别介绍:
voidfarsetfillstyle(intpattern,intcolor);color的值是当前屏幕图形模式时颜色的有效值。
pattern的值及与其等价的符号常数如表7所示。
表7.关于填充式样pattern的规定━━━━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值含义───────────────────────────EMPTY_FILL0以背景颜色填充SOLID_FILL1以实线填充LINE_FILL2以直线填充LTSLASH_FILL3以斜线填充(阴影线)SLASH_FILL4以粗斜线填充(粗阴影线)BKSLASH_FILL5以粗反斜线填充(粗阴影线)LTBKSLASH_FILL6以反斜线填充(阴影线)HATCH_FILL7以直方网格填充XHATCH_FILL8以斜网格填充INTTERLEAVE_FILL9以间隔点填充WIDE_DOT_FILL10以稀疏点填充CLOSE_DOS_FILL11以密集点填充USER_FILL12以用户定义式样填充━━━━━━━━━━━━━━━━━━━━━━━━━━━━
除USER_FILL(用户定义填充式样)以外,其它填充式样均可由setfillstyle()函数设置。
当选用USER_FILL时,该函数对填充图模和颜色不作任何改变。
之所以定义USER_FILL主要因为在获得有关填充信息时用到此项。
voidfarsetfillpattern(char*upattern,intcolor);设置用户定义的填充图模的颜色以供对封闭图形填充。
其中upattern是一个指向8个字节的指针。
这8个字节定义了8x8点阵的图形。
每个字节的8位二进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充。
voidfargetfillpattern(char*upattern);
该函数将用户定义的填充图模存入upattern指针指向的内存区域。
voidfargetfillsetings(structfillsettingstypefar*fillinfo);获得现行图模的颜色并将存入结构指针变量fillinfo中。
其中fillsettingstype结构定义如下:
structfillsettingstype{intpattern;/*现行填充模式*/intcolor;/*现行填充模式*/};
三、任意封闭图形的填充截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对任意封闭图形进行填充。
为此,TURBOC提供了一个可对任意封闭图形填充的函数,其调用格式如下:
voidfarfloodfill(intx,inty,intborder);
其中:
x,y为封闭图形内的任意一点。
border为边界的颜色,也就是封闭图
形轮廓的颜色。
调用了该函数后,将用规定的颜色和图模填满整个封闭图形。
注意:
1.如果x或y取在边界上,则不进行填充。
2.如果不是封闭图形则填充会从没有封闭的地方溢出去,填满其它地方。
3.如果x或y在图形外面,则填充封闭图形外的屏幕区域。
4.由border指定的颜色值必须与图形轮廓的颜色值相同,但填充色可选任
意颜色。
下例是有关floodfill()函数的用法,该程序填充了bar3d()所画长方体
中其它两个未填充的面。
例12:
#include<>
#include<>main(){intgdriver,gmode;strctfillsettingstypesave;gdriver=DETECT;initgraph(&gdriver,&gmode,"");setbkcolor(BLUE);cleardevice();setcolor(LIGHTRED);setlinestyle(0,0,3);setfillstyle(1,14);/*设置填充方式*/bar3d(100,200,400,350,200,1);/*画长方体并填充*/floodfill(450,300,LIGHTRED);/*填充长方体另外两个面*/floodfill(250,150,LIGHTRED);rectanle(450,400,500,450);/*画一矩形*/floodfill(470,420,LIGHTRED);/*填充矩形*/getch();closegraph();
(6)图形模式下的文本输出
在图形模式下,只能用标准输出函数,如printf(),puts(),putchar()函数输出文本到屏幕。
除此之外,其它输出函数(如窗口输出函数)不能使用,即是可以输出的标准函数,也只以前景色为白色,按80列,25行的文本方式输出。
Turbo也提供了一些专门用于在图形显示模式下的文本输出函数。
下面将分别进行介绍。
一、文本输出函数
voidfarouttext(charfar*textstring);
该函数在当前位置输出字符串指针textstring所指的文本。
voidfarouttextxy(intx,inty,charfar*textstring);该函数输出字符串指针textstring所指的文本在规定的(x,y)位置。
其中x和y为象元坐标。
说明:
这两个函数都是输出字符串,但经常会遇到输出数值或其它类型的数据,此时就必须使用格式化输出函数sprintf()。
sprintf()函数的调用格式为:
intsprintf(char*str,char*format,variable-list);它与printf()函数不同之处是将按格式化规定的内容写入str指向的字符串中,返回值等于写入的字符个数。
例如:
sprintf(s,"yourTOEFLscoreis%d",mark);这里s应是字符串指针或数组,mark为整型变量。
二、有关文本字体、字型和输出方式的设置
有关图形方式下的文本输出函数,可以通过setcolor()函数设置输出文本的颜色。
另外,也可以改变文本字体大小以及选择是水平方向输出还是垂直方向输出。
voidfarsettexjustify(inthoriz,intvert);
该函数用于定位输出字符串。
对使用outtextxy(intx,inty,charfar*strtextstring)函数所输出的字符串,其中哪个点对应于定位坐标(x,y)在Turbo中是有规定的。
如果把一个字符串看成一个长方形的图形,在水平方向显示时,字符串长方形按垂直方向可分为顶部,中部和底部三个位置,水平方向可分为左,中,右三个位置,两者结合就有9个位置。
settextjustify()函数的第一个参数horiz指出水平方向三个位置中的一个,第二个参数vert指出垂直方向三个位置中的一个,二者就确定了其中一个位置。
当规定了这个位置后,用outtextxy()函数输出字符串时,字符串长方形的这个规定位置就对准函数中的(x,y)位置。
而对用outtext()函数输出字符串时,这个规定的位置就位于现行游标的位置。
有关参数horiz和vert的取值参见表9。
表9.参数horiz和vert的取值━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值用于────────────────────────LEFT_TEXT0水平RIGHT_TEXT2水平BOTTOM_TEXT0垂直TOP_TEXT2垂直CENTER_TEXT1水平或垂直━━━━━━━━━━━━━━━━━━━━━━━━
voidfarsettextstyle(intfont,intdirection,intcharsize);
该函数用来设置输出字符的字形(由font确定)、输出方向(由direction确定)和字符大小(由charsize确定)等特性。
Turbo对函数中各个参数的规定见下列各表所示:
表10.font的取值━━━━━━━━━━━━━━━━━━━━━━━━符号常数数值含义────────────────────────DEFAULT_FONT08*8点阵字(缺省值)TRIPLEX_FONT1三倍笔划字体SMALL_FONT2小号笔划字体SANSSERIF_FONT3无衬线笔划字体GOTHIC_FONT4黑体笔划字━━━━━━━━━━━━━━━━━━━━━━━━
表11.d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 图形 编程