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

本文介绍了使用C语言进行图形程序设计的基础知识,包括文本与图形显示方式、坐标系概念、图形驱动程序及模式控制等内容,并详细讲解了如何利用C语言进行图形绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1  C语言图形程序设计基础

1.1.1屏幕显示方式与坐标系

1.文本方式与坐标系

在屏幕上只能显示字符的方式称为文本方式。在文本方式下,屏幕上可以显示的最小单位就是字符。为了能在指定位置显示每个字符,C语言提供了字符坐标系,字符坐标系原点为(11),水平为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*43VGA     80*45     彩色

2.图形方式

在屏幕上显示图形的方式称为图形方式。图形方式下,屏幕上每个像素的显示位置用点坐标来描述。在此坐标系统中,屏幕左上角为坐标原点(00),水平方向为x轴,自左向右;垂直方向为y轴,自上向下。分辨率不同,max xmax 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)已知显示器类型的图形系统初始化:

#include <graphics.h>

main()

{

  int gdriver,gmode;

  gdriver=CGA;

  gmode=CGAC0;

  initgraph(&gdriver,&gmode, "g://Win-TC");

  bar3d(10,20,50,80,0,0);

  getch();

  closegraph();

}

2)自动初始化图形系统:

#include<graphics.h>

main()

{

  int gdriver=DETECT,gmode;

  initgraph(&gdriver,&gmode, "g://Win-TC");

  bar3d(10,20,50,80,0,0);

  getch();

  closegraph();

}

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,gmodelo,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);

例:

显示系统中图形硬件支持的最大的xy

#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);

说明:若clipflag1,则超出窗口的输出自动剪裁掉,若clipflag0,则图形窗口之外不被剪裁

例:

#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,包括EGAVGA适配器。

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();

  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值