开发工具:
文件大小: 168kb
下载次数: 0
上传时间: 2019-10-15
详细说明:C语言图形函数开发,时学习图像开发的必备资料,提供了丰富的图形函数介绍,介绍了有关画点,画线,画面等的函数使用。C语言学习的宝典。#include
# include≤ graphics. h>
int maino
int driver- DETECT, gmode
registerbgidriver( egavga driver):/*建立独立图形运行程序*/
initgraph( driver, gmode, c: \tc)
bar:3d(50,50,250,150,20,1);
closegraph();
return o
上例编译链接后产生的执行程序可独立运行。
如不初始化成EGA或CGA分辨牽,而想初始化为¢GΔ分辨率,则只需要将上述步骤中
有 EGAVGA的地方用CGA代替即可。
3.屏幕颜色的设置和清屏函数
对于图形模式的屏幕颜色设置,同样分为背景色的设置和前景色的设置。在 Turbo C中分
别用下血两个函数
设置背景色:
void far setbkcolor( int color)
设置作图色:
void far sctcolor(int color)
其中 color为图形方式下颜色的规定数值,对EGA,ⅤGA显示器适配器,有关颜色的符号
常数及数值见下表所示。
表3有关屏幕颜色的符号常数表
符号常数数值含义
符号常数数值含义
BLACK
0
黑色
DARKGRAY
8深灰
BLUE
色
LIGHTBLUE
9
深
GREEN
绿色
LIGHTGREEN
10淡绿
CYAN
青色
LIGHTCYAN
淡青
RED
红色
LIGHTRED
12淡红
MAgENTA
洋红
LIGHTMAGENTA13淡洋红
BROWN
棕色
YELLOW
l4黄色
LIGHTGRAY
淡灰
WHITE
15
白色
清除图形屏幕内容使用清屏函数,其调用格式如下
voide far cleardevice(void)
有关颜色设置、清屏函数的使用请看例8。
#include
# include≤ graphics. h>
int maino
int driver, gmode, 1;
gdriver-=DETECT;
registerbgidriver( EGAVGA_ DRIVER):/*建立独立图形运行程序*
initgraph(& driver,& gmode","");图形初始化*
sctbkcolor(O
体设置图形背景*
cleardeviceo
for(i=0;i≤=15;i++)
setcolor(1);
/*设置不同作图色*
circle(320,240,20+*10);/*画半径不同的圆*
delay (100):
泮*延迟100毫秒*
for(i=0;i<=15;i++)
setbkcolor(i
*设置不同背景色*
cleardevice()
circle(320,240,20+1*10);
delay (100)
closegrap
rcturn o
另外, TURBO C也提供了几个获得现行颜色设置情况的函数。
int far getbkcolor(void)
返回现行背景颜色值。
int far getcolor(void)
返回现行作图颜色值。
int far getmaxcolor(void);返回最高可用的颜色值。
4.基本图形函数
基木图形函数包括画点,线以及其它一些基木图形的函数。木节对这些涵数作一全面的介
、画点
1.画点数
void far putpixcl(int x, int y, int color);
函数表示有指定的象元画一个按co所确定颜色的点。对于颜色coor的值可从表3中
而对x,y是指图形象元的坐标。
在图形模式下,是按象元来定义坐标的。对VGA适配器,它的最高分辨率为640x480,其
中640为整个屏幕从左到右所有象元的个数,480为整个屏幕从上到卜所有象元的个数。屏幕的
左上角坐标为(0,0),右下角坐标为639,479),水平方向从左到右为x轴正向,重直方向从上到下
为y轴正向。 TURBO C的图形函数都是相对于图形屏幕标,即象元来说的。
关于点的另外一个函数是:
nt far getpixel(int x, int y)
它获得当前点(x,y)的颜色值
2.有关坐标位置的函数
int far getmaxx( void)
返回x轴的最大值
int far getmaxy ( void)
返冋y轴的最大值
int far getx( void
返冋游标在ⅹ轴的位置。
id far gely(void);
返冋游标有y轴的位置。
void far moveto(int x, int y)
移动游标到(x,y)点,不是画点,在移动过程中亦画点。
oid far moverel(int dx, int dy
移动游标从现行位置(x,y)移动到(x+dx,y+dy)的位萓,移动过程中不画点。
画线
画线函数
TURBO C提供了一系列画线函数,下面分别叙述:
d far line(int XO, int yO, int xl, int yD)
田一条从点(x0,y0)到(x1,y1)的直线
d far lincto(int x, int y)
画一作从现行游标到点(x,y)的直线。
void far lincrcl(int dx, int dy);
画条从现行游标(x,y)到按相对增量定的点(x+dx,ydy)的直线。
void far circle(int x, int y, int radius)
以(x,y)为圆心, radius为半径,画一个圆。
void far arc(int x, int y, int stangle, int endangle, int radius)
以(x,y)为园心, radius为半径,从 stangle开始到 endangle结束(用度表示)画一段圆弧线。在
TURBO C中规定x轴正向为0度,逆时针方向旋转一周,依次为90,180,270和360度(其它有
关凶数也按此规定,不再重述)。
void ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius)
以(x,y)为中心, xradius, yradius为x轴和y轴半径,从角 stangle开始到 endangle结束画
段懶圆线,当 tangle=0, cndanglcs=360时,画出一个完整的椭圆
void far rectangle(int xl, int yl, int x 2, inty 2)
以(x1,y1)为左上角,(x2,y2)为右下角画一个矩形框。
void far drawpoly (int numpoints, int far *polypoints)
画一个顶点数为 outpoints,各顶点坐标由 polypoints给出的多边形。 polypoints整型数
组必须至少有2倍顶点数个无素。每个顶点的坐标都定义为x,y,并且x在前。值得注意的
是当画一个封闭的多边形时, numpoints的值取实际多边形的顶点数加一,并且数组 polypots
中第一个和最后一个点的坐标相同。
下面举一个用 drawpolyo函数画箭头的例子
例9:
Include
升 include< graphics. h>
nt maino
int driver, gmode, 1;
int arw[l6]={200,102,300.102,300,107,330,
100,300,93,300,98,200,98,200,102};
driver- DEtECt:
rcgistcrbgidrivcr(EGAVGA drivcr)
initgraph(&driver, &gmode, "
(BLUE:
cleardeviceo
olor(12);
件设置作图颜色*
drawpoly(8,arw);画一箭头*
gotch;
closegraph(
return
0;
2.设定线型函数
在没有对线的特性进行改定之前, TURBO O用其默认值,即一点宽的实线,但 TURBO C
也提供了可以改变线型的函数。线型包括:宽度和形状。其中宽度只有两种选择:一点宽和三点
宽。而线的形状则有五种。下面介绍有关线型的设置函数
void far sellinestyle(int linestyle, unsigned upattern, int thickness
该函数用来设置线的有关信息,其中 linestyle是线形状的规定,见表5
表5.有关线的形状( linestyle)
符号常数
数值
含义
SOLID LINE
0
实线
DOTTED LINE
点线
CENTER LINE
中心线
DASHED LINE
点画线
USERBIT LINE
4
用户定义线
hickness是线的宽度,见表6
衣6.有关线宽 thickness)
符号常数数值
含义
NORM WIDTH
1点宽
THIC WIDTH
3三点宽
对于 upattern.只有 linestyle选 USERBIT LINE时才有意义(选其它线型, pattern取0即
可)。此进 uppattcrn的16位二进制数的每一位代表一个象元,如果那位为1,则该象元打开,香
则该象元关闭。
void far getlinesettings(struct linesettingstype far * lineinfo)
该函数将有关线的信息存放到由 lineinfo指向的结构中,表中 linesettingstype的结构如下:
struct lincscttingstypc(
int linestvle
unsigned upattern
int thickness
例如下面两句程序可以读出当前线的特性
struct linesellingslype *inlo
getlinesettings(info)
void far sctwritcmodc(int modc):
该函数规定画线的方式。如果mode-0,则表示画线时将所画位置的原来信息覆盖了(这是
TURBO C的默认方式)。如果modc=1,则表示画线时用现在特性的线与所画之处原有的线进行
异或(XOR操作,实际上画岀的线是原有线与现在规定的线进行异或后的结果。因此,当线的特
性不变,进行两次画线操作相当于没有画线。
有米线型设定和画线函数的例子如下所示
例10
#include
# include≤ graphics. h>
int maino
int driver, gmode, 1;
gdriver-=DETECT;
registerbgidriver(EGAVGa driver)
initgraph(&driver, &gmode,
setbkcolor(BLUE)
cleardeviceo
setcolor(GREEN
circle(320,240,98);
sellinestyle(0,0,3):*设置三点宽实线*
olor(2
rectangle(220,140,420,340);
setcolor(WHITE;
yle(4,0xa,1);/*设置一点宽用户定义线*/
line(220,240,420,240);
line(320,140,320,340)
elcho
closegraph(
return o
5.封闭图形的填充
填充就是用規定的颜色和图模填满一个封闭图形
先画轮廓再填充
TURBO C提供了一些先画出基本图形轮廓,雨按规定图模和颜色填充整个封闭图形的函
数。在没有改变填充方式时, TURBO O以默认方式填充。下面介绍这些函数。
void far bar(int xl, int yl, int x2, int y2)
确定一个以(x1,yl)为左上角,(x2,y2)为右下角的矩形窗凵,再按规定图模和颜色填允。
说明:此函数不画出边框,所以填充色为边框
void far bar3d(int xl, int yl, int x2, int y2
int depth, int toptlag)
当 topflag为非0时,画出一个三维的长方体。当 topflag为0时,三维图形不封顶,实际上
很少这样使用。
说明:bar3dO函数中,长方体第三维的方向不随任何参数而变,即始终为45度的方向。
void far pieslice(int x, int y, int stangle, int endangle, int radius)
画一个以(x,y)为圆心, radius为半径, stangle为起始角度, endangle为终止角度的扇形,再
按规定方式填充。当 stangle-0, endangle=360时变成一个实心圆,并在圆内从圆点沿X轴正向画
条半径。
void far sector(int x, int y, int stanlc, intcndanglc, int xradius, int yradius)
面个以(x,y)为圆心分别以 xradius, radius为x轴和y轴半径, stangle为起始角
endangle为终止角的椭圆扇形,再按规定方式填充。
、设定填充方式
TURBO C有四个与填充方式有关的函数。卜面分别介绍
void far sctfillstylc(int pattcrn, int color);
color的值是当前屏幕图形模式吋颜色的有效值。 pattern的值及与其等价的符号常数如衣7
所
表7.关于填充式样 pattern的规定
符号常数
数值
含义
EMPTY FILL
0
以背景颜色填充
SOLID FILL
以实填充
LINE FILL
2
以直线填充
LTSLASH FILL
以斜线填充(阴影线)
SLASH FILL
以粗斜线填充(粗阴影线)
BKSLASH FILL
以粗反斜线填充(粗阴影线)
LTBKSLASH FILL 6
以反斜线填充(阴影线)
HATCH FILL
以直方网格填充
Ⅹ HATCH FILL
以斜网格填允
INTTERLEAVE FILL 9
以间隔点填充
WIDE DOT FILL
以稀疏点填充
CLOSE DOS FILL
以密集点填充
USER FILL
12
以用户定义式样填充
除 USER FILL(用户定义填充式样)以外.其它填充式样均可由 setfillslyleo函数设置。当
选用 USER FILL时,该函数对填充图模和颜色不作任何改变。之所以定义 USER FILL主要因
为在获得有关填充信息时用到此项
void far setfillpattern(char upattern, int color)
设置用户定义的填充图模的颜色以供对封闭图形填充。
其中 upattern是一个指向8个宇节的指针。这8个字节定义了8x8点阵的图形。每个字节
的8位∵进制数表示水平8点,8个字节表示8行,然后以此为模型向个封闭区域填充
void far getfillpattern (char upattern
该函数将用户定义的填充图模存入 pattern指针指向的内存区域。
void far getllllsetings(struct fillsettingstype far llllinlo
获得现行图模的颜色并将存入结构指针变量 fileinfo中。其中 fillsettingstype结构定义如下:
struct fillsettingstypei
Int pattern;/*现行填充模式*/
int color;泮*现行填充模式*
有关图形填充图模的颜色的选择,请看下面例程。
例11:
include< graphics. h
maine
char str[8]={10,20,30,40,50,60,70.80};/*用户定义图模*
int driver gmode. i
struct fillscttingstypc savc;定义一个用来存储填充信息的结构变量*
driver DETECT
initgraph(&driver, &gmode, c: \\c")
setbkcolor (BLUE)
cleardevice(;
for(=0:i<13;i)
setfillstyle(i, 2+1)
*设置填充类型*
bar(100,150,200,50);
画矩形并填充*
bar3d(300,100,500,200,70,1);/*画长方体并填充*/
pieslice(200,300,90,180,90);*画扇形并填充*
sector(500,300,180,270,200,100);/画椭圆扇形并填充*/
delay (1000)
延时1秒
cleardevice(;
setcolor(14)
setfillpattern(str, RED)
bar(100,150,200,50)
bar3d(300,100,500,200,700)
pieslice(200,300,0,360,90);
sector(500,300,0.360,100,50);
getcho:
getfillsettings( &save
/*获得用户定义的填充模式信息*
curser
O
printf("The pattern is %d, The color of filling is %d", save pattern, save color)
输出目前填充图模和颜色值*
retch
以上程序运行结束后,在屏幕上显示出现行填充图模和颜色的常数值。
、任意封闭图形的填充
截止目前为止,我们只能对一些特定形状的封闭图形进行填充,但还不能对
任意封闭图形进行填充。为此, TURBO O提供了·个可对任意封闭图形填充的函
数,其调用格式如
void far floodfill(int x, int y, int border)
其中:x,y为封闭图形内的仟意一点。 border为边界的颜色,也就是封闭图形轮廓的颜色。
调用了该函数后,将用规定的颜色和图模填满整个封闭图形。
注意:
1.如果x或y取在边界十,则不进行填充
2.如果不是封闭佟形则填充会从没有封闭的地方溢出去,填满其它地方。
3.如果x或y在图形外面,则填充封闭图形外的屏幕区域。
4.由 border指定的颜色值必须与图形轮廓的颜色值相同,但填充色可选任意颜色。下例
是有关 floodfillo函数的用法,该程序填充了bar3d)所画长方体中其它两个未填充的面。
例12
#include
#includc
main()
strct fillsettingstype save
driver=DETECT
initgraph( &gdrivcr, &gmodc,
setbkcolor(BlUE)
cleardeviceo
selcolor(LiGhTRED)
setlinestyle(0,0, 3)
setfillstyle( 1, 14)
*设置填充方式*
bar3d(100,200,400,350,200,1)γ画长方体并填充*
nood nil(450.300 LIGHTRED),填充长方体另外两个面*
floodfill(250, 150, LIGHTRED)
rectangle(450,400,500,450);/矩形*
floodfill1470,420, LIGHTRED)/填充矩形*
getcho
closegrapho
6.有关图形窗口和图形屏幕操作函数
图形窗口操作
象文本方式下可以设定屏幕窗凵一样,图形方式下也可以在屏幕上某一区域设定窗凵,只
是设定的为图形窗口而已,其后的有关图形操作都将以这个窗口的左上角0,0)作为坐标原点,
而且可为通过设置使窗口之外的区域为不可接触。这样,所有的图形操作就被限定在窗口内进
行
void far setviewport(int xl, int yl, int x2, int y2, int clipflag)
设定一个以(xl,y)象元点为左上角,(x2,y2)象元为右下角的图形窗凵,其中x12y1,x22y2是相
对于整个屏幕的坐标。若 clipflag为非0,则设定的图形以外部分不可接触,若 clipflag为0,则图
形窗口以外可以接触。
void far clearviewport(void)
清除现行图形窗口的内容。
void far gctvicwscttings(struct vicwporttypc far* viewport
获得关于现行窗∏的信息,并将其存于 view portly pe定义的结构变量 view port中,其中
vlewporttype的结构说明如下:
struct view porlypei
int left, top right, bottom;
int cliplag
注明:1.窗∏颜色的设置与前面讲过的屏幕颜色设置相同,但屏幕背景色和窗∏背景色只能是
一种颜色,如果窗口背景色改变,整个屏幕的背景色也将改变这与文本窗口不同
2.可以在同一个屏幕上设置多个窗口,但只能有一个现行窗口工作,要对其它窗口操作,
通过将定义那个窗口的 setviewport)函数再用一次即可。
3.前面讲过图形屏幕操作的函数均适合于对窗凵的操作。
屏幕操作
除了清屏函数以外,关于屏幕操作还有以下函数:
void far setactivepa ge(int pagenum
void far setvisualpage(int pagenum)
这两个函数只用于EGA,ⅤGA以及 HERCULES图形适配器。 setctivepage(函数是为图形
输岀选择激活页。所谓激活页是指后续图形的输岀被写到函数选定的 pagenunl页面,该页面并
不一定可见。 setvisualpageo函数才使 pagenum所指定的页面变成可见页。页面从0开始( Turbo C
默认页)。如果先用 setactivepage函数在不同页面上画出一幅幅图像,雨用 setvisualpageo函数交
替显示,就可以实现一些动画的效果。
void far getimage(int xl, int yl, int x2, int y2, void far *mapbuf)
void far putimgc(int x, int,y, void mapbuf, int op)
unsined far imagesize(int xl, int yl, int x2, int y2)
这三个函数用于将屏幕上的图像复制到内存然后再将内存中图像送回到屏幕上。首先通过
函数 imagesize)测试要保仔左上角为(x,yl),右上角为(x2,y2)的图形屏幕区域内的全部内容需多
少个字节,然后再给 mapbuf分配一个所测数字节内存空间的指针。通过调用 getimage函数就可
将该区域内的图像保存在内存中,需要时可用 putina ge(函数将该图像输出到左上角为点(x,y)
位置上,其中 getimage()函数中参数op规定如何释放内仔中图像。关于这个参数的定义参见表8
表8. putina geO函数中的op值
符号常数
数值
含义
COPY PUT
0
复制
XOR PUT
与屏幕图像异或的复制
OR PUT
与屏幕图像或后复制
AND PUT
与屏幕图像与后复制
NOT PUT
复制反像的图形
0
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.