您的位置:首页 > 理论基础

计算机图形图像学实验指导书

2010-12-26 20:14 344 查看
1.1 C语言图形程序设计基础

1.1.1屏幕显示方式与坐标系
1.文本方式与坐标系
在屏幕上只能显示字符的方式称为文本方式。在文本方式下,屏幕上可以显示的最小单位就是字符。为了能在指定位置显示每个字符,C语言提供了字符坐标系,字符坐标系原点为(1,1),水平为x轴,分为若干列;垂直方向为y轴,分为若干行。
Turbo C支持以下6种不同显示方式:
v
BW40:
40*25 黑白
v
C40:
40*25 彩色
v
BW80:
80*25 黑白
v
C80: 80*25
彩色
v
MONO: 80*25
单色
v
C4350:
EGA 80*43;VGA 80*45 彩色
2.图形方式
在屏幕上显示图形的方式称为图形方式。图形方式下,屏幕上每个像素的显示位置用点坐标来描述。在此坐标系统中,屏幕左上角为坐标原点(0,0),水平方向为x轴,自左向右;垂直方向为y轴,自上向下。分辨率不同,max x、max y也不同。

1.1.2图形驱动程序与图形模式
1.图形驱动程序
符号常量
数值
符号常量
数值
DETELT
0
IBM8514
6
CGA
1
HERCMONO
7
MCGA
2
ATT400
8
EGA
3
VGA
9
EGA64
4
PC3270
10
EGAMONO
5
2.图形模式
驱动程序
图形模式

分辨率
调色板
CGA
CGAC0
0
320*200
C0
CGAC1
1
320*200
C1
CGAC2
2
320*200
C2
CGAC3
3
320*200
C3
CGAC4
4
640*200
2色
EGA
EGAHI
0
640*200
16色
EGALO
1
640*350
16色
VGA
VGALO
0
640*200
16色
VGAMED
1
640*350
16色
VGAHI
2
640*480
16色
1.1.3图形系统初始化和模式控制
Turbo C的图形函数均在头文件“graphics.h”中定义,所以凡是要用到这些函数的程序,在程序文件的开头都要些上文件包含命令:
#include<graphics.h>
1.
图形系统初始化函数
void for initgraph(int *gdriver,int*gmode,char*path)
gdriver:指定要装入的图形驱动程序
gmode:设置图形显示模式
path:指明驱动程序所在路径
1)已知显示器类型的图形系统初始化:
v #include <graphics.h>
v main()
v {
v int gdriver,gmode;
v gdriver=CGA;
v gmode=CGAC0;
v initgraph(&gdriver,&gmode,
"g://Win-TC");
v bar3d(10,20,50,80,0,0);
v getch();
v closegraph();
v }
2)自动初始化图形系统:
v #include<graphics.h>
v main()
v {
v int gdriver=DETECT,gmode;
v initgraph(&gdriver,&gmode,
"g://Win-TC");
v bar3d(10,20,50,80,0,0);
v getch();
v closegraph();
v }
2.图形系统的关闭
void far closegraph();
3.图形模式的控制
1)返回当前图形模式值int far getgraphmode(void);
2)恢复屏幕在图形初始化前模式
void far restorecrtmode(void)
3)设置系统图形模式并清屏幕
void far setgraphmode(int gmode);
4)获取图形驱动器可使用的模式范围
void far getmoderang(int driver,int
*lomode,int*himode);
例:
#include<stdio.h>
#include<graphics.h>
main()
{
int gdriver,gmode,lo,hi; gdriver=CGA;
getmoderange(CGA,&lo,&hi);
printf("CGA supporting modes range
from %d to %d/n",lo,hi);
Initgraph(&gdriver,&lo, "g://Win-TC");
bar3d(100,30,130,150,0,0);
getch();
gmode=getgraphmode();
restorecrtmode();
printf("now in text mode,press any key back to
graphics mode./n");
getch();
setgraphmode(gmode);
rectangle(50,30,100,130);
getch();
closegraph();
}
1.1.4图形坐标的设置
1、定点
1)把当前光标移到所需的位置 void far moveto(int x,int y);
2)以增量方式移动当前光标 void far moverel(int deltax,int deltay);
2、读取当前光标位置 int far getx(void);int far
gety(void);
3、读取x,y轴的最大值 int far getmaxx(void);int far getmaxy(void);
例:
显示系统中图形硬件支持的最大的x,y值
#include<stdio.h>
#include<graphics.h>
main()
{ int
gdriver,gmode;
gdriver=CGAC0;
initgraph(&gdriver,&gmode, " ");
printf("max x,y is
%d,%d",getmaxx(),getmaxy());
getch();
restorecrtmode();
}
例:画一王字
#include<graphics.h>
main()
{ int
gdriver=DETECT,gmode;
int x,y;

initgraph(&gdriver,&gmode, " ");
cleardevice();

moveto(100,40),
linerel(40,0);

x=getx(); y=gety();

moveto(x,y+20);
linerel(-40,0);

moverel(0,20); linerel(40,0);

moverel(-20,0); linerel(0,-40);
getch();

closegraph();
}
1.1.5屏幕窗口操作
1、图形屏幕处理
1)清除图形屏幕void far cleardevice(void);
例:
#include<graphics.h>
main()
{
int gdriver,gmode;
gdriver=VGA;
gmode= VGALO;
initgraph(&gdriver,&gmode, " ");
cleardevice();
bar3d(10,20,50,180,0,0,);
getch();
closegraph();
}
2)设置图形输出活动页void far setactivepage(int page);
3)设置可见图形页号void far setvisualpage(int page);
#include<graphics.h>
main()
{ int
gdriver,gmode;

gdriver=VGA;gmode=VGAHI;

initgraph(&gdriver,&gmode, " ");

cleardevice();

setactivepage(1);

circle(150,130,80);

setactivepage(0);

rectangle(40,160,90,180);
getch();
setvisualpage(1); getch();
setvisualpage(0); getch();

closegraph();
}
2、屏幕窗口操作
1)清除当前图形窗口
void far clearviewport(void);
2)设置图形窗口
void far setviewport(int left,int top,int right,int
bottom,int clipflag);
说明:若clipflag为1,则超出窗口的输出自动剪裁掉,若clipflag为0,则图形窗口之外不被剪裁
例:
#include<graphics.h>
main()
{ int
gdriver=CGA,gmode=0;
initgraph(&gdriver,&gmode, "
");

rectangle(30,25,80,80);

setviewport(30,25,80,80,0);

line(0,0,100,150);getch();

clearviewport();getch();

cleardevice();getch();
setviewport(20,15,80,80,1);

rectangle(0,0,60,65);

line(0,0,100,150);getch();

closegraph();
}
1.2图形颜色设置
1.2.1颜色的设置
1.设置当前背景色 void far setbkcolor(int
color);
下表列出背景色名称和数值的对应关系。缺省时,默认值为0,即黑色。
符号常量
数值
含义
符号常量
数值
含义
BLACK
0
黑色
LIGHTBLUE
9
浅蓝
BLUE
1
蓝色
LIGHTGREEN
10
浅绿
GREEN
2
绿色
LIGHTYAN
11
浅青
CYAN
3
青色
LIGHTRED
12
浅红
RED
4
红色
LIGHTMAGENTA
13
浅洋红
MAGENTA
5
洋色
YELLOW
14
黄色
BROWN
6
棕色
WHITE
15
白色
LIGHTGRAY
7
浅灰
DARKGRAY
8
深灰
2.设置当前画图颜色void far setcolor(int color)
例:将画笔设置为红色,画一圆
#include"graphics.h"
main()
{
int
gdrive=EGA,gmode=EGAHI;

initgraph(&gdrive,&gmode,"");
setbkcolor(1);
setcolor(RED);

circle(120,100,50);
getch();
closegraph();
}
2.2.2调色板
根据颜色控制方法不同,可以把支持的颜色屏幕划分为两类:一类是CGA;另一类是EGA,包括EGA和VGA适配器。
1.CGA调色板
调色板号
颜色0
颜色1
颜色2
颜色3
CGAC0
背景色
CGA-LIGHTGREEN
CGA-LIGHTRED
CGA_YELLOW
CGAC1
背景色
CGA_LIGHTCYAN
CGA_LIGHTMAGENTA
CGA_WHITE
CGAC2
背景色
CGA_GREEN
CGA_RED
CGA_YELLOW
CGAC3
背景色
CGA_CYAN
CGA_MAGENTA
CGA_YELLOW
低分辨率方式下,显示4种颜色
高分辨率方式下,显示2种颜色
例如: int gdrive=CGA,gmode=CGAC1;
initgraph(&gdrive,&gmode,"");
……
setcolor(CGA-WHITE);
……
2.EGA调色板(共64色,调色板16色)
符号常量
数值
含义
符号常量
数值
含义
EGA-BLACK
0
EGA黑色
EGA-DARKGRAY
56
EGA深灰
EGA-BLUE
1
EGA蓝色
EGA-LIGHTBLUE
57
EGA浅蓝
EGA-GREEN
2
EGA绿色
EGA-LIGHTGREEN
58
EGA浅绿
EGA-CYAN
3
EGA青色
EGA=LIGHTCYAN
59
EGA浅青
EGA-RED
4
EGA红色
EGA-LIGHTRED
60
EGA浅红
EGA-MAGENTA
5
EGA洋红
EGA-LIGHTMACENTA
61
EGA浅洋红
EGA-LIGHTGARY
7
EGA浅灰
EGA-YELLOW
62
EGA黄色
EGA-BROWN
20
EGA棕色
EGA-WHITE
63
EGA白色
3.改变调色板的一种颜色
void far setpalette(int oldcolor,int newcolor);
CGA模式,只有背景色能改变oldcolor=0
例如:setpalette(0,GREEN);
EGA模式,oldcolor是背景色表中任一种颜色, newcolor是上表3.5任一种颜色
例如:setpalette(BLUE,EGA-GREEN);
或setpalette(1,2);
2.2.3读取颜色信息
1.读取当前背景颜色 int far getbkcolor(void)
例如:printf(“background color is %d”,getbkcolor());
2.读取当前画图颜色int far getcolor(void)
3.读取最高可用颜色数int far getmaxcolor(void)

返回当前模式下最大有效颜色值。在EGA模式下返回最大值15,在CGA模式下,返回最大值3
4.在点(x,y)处画一规定颜色点
void far putpixel(int x,int y,int
color);
5.读取点(x,y)的颜色
int far getpixel(int x,int y);
例:在不同位置画点
#include"graphics.h"
main()
{ int
gdriver=DETECT,gmode;
int color,i,max,bkcolor,brushcolor;

initgraph(&gdriver,&gmode,"");
max=getmaxcolor();
for(i=0;i<20;i++)
putpixel(50+i*10,20,(max-5));
color=getpixel(50,20);
putpixel(150,150,color);
brushcolor=getcolor();
bkcolor=getbkcolor();

printf("background color is %d ,brush color is %d , color is
%d", bkcolor,brushcolor,color);
putpixel(200,150,brushcolor);
getch();
closegraph();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: