第一章
1、 试述计算机图形学研究的基本内容?
答:见课本 P5-6 页的 1.1.4 节。
2、 计算机图形学、图形处理与模式识别本质区别是什么?请各举一例说明。
答:计算机图形学是研究根据给定的描述,用计算机生成相应的图形、图像,且所生成
的图形、图像可以显示屏幕上、硬拷贝输出或作为数据集存在计算机中的学科。计算机图形
学研究的是从数据描述到图形生成的过程。例如计算机动画制作。
图形处理是利用计算机对原来存在物体的映像进行分析处理,然后再现图像。例如工业
中的射线探伤。
模式识别是指计算机对图形信息进行识别和分析描述,是从图形(图像)到描述的表达
过程。例如邮件分捡设备扫描信件上手写的邮政编码,并将编码用图像复原成数字。
3、 计算机图形学与 CAD、CAM 技术关系如何?
答:见课本 P4-5 页的 1.1.3 节。
4、 举 3 个例子说明计算机图形学的应用。
答:①事务管理中的交互绘图
应用图形学最多的领域之一是绘制事务管理中的各种图形。通过从简明的形式呈现出数
据的模型和趋势以增加对复杂现象的理解,并促使决策的制定。
②地理信息系统
地理信息系统是建立在地理图形基础上的信息管理系统。利用计算机图形生成技术可以
绘制地理的、地质的以及其它自然现象的高精度勘探、测量图形。
③计算机动画
用图形学的方法产生动画片,其形象逼真、生动,轻而易举地解决了人工绘图时难以解
决的问题,大大提高了工作效率。
5、 计算机绘图有哪些特点?
答:见课本 P8 页的 1.3.1 节。
6、 计算机生成图形的方法有哪些?
答:计算机生成图形的方法有两种:矢量法和描点法。
①矢量法:在显示屏上先给定一系列坐标点,然后控制电子束在屏幕上按一定的顺序扫
描,逐个“点亮”临近两点间的短矢量,从而得到一条近似的曲线。尽管显示器产生的只是
一些短直线的线段,但当直线段很短时,连成的曲线看起来还是光滑的。
②描点法:把显示屏幕分成有限个可发亮的离散点,每个离散点叫做一个像素,屏幕上
由像素点组成的阵列称为光栅,曲线的绘制过程就是将该曲线在光栅上经过的那些像素点串
接起来,使它们发亮,所显示的每一曲线都是由一定大小的像素点组成的。当像素点具有多
种颜色或多种灰度等级时,就可以显示彩色图形或具有不同灰度的图形。
7、当前计算机图形学研究的课题有哪些?
答:见课本 P10-11 页的 1.4 节。
—1—
8、简述三维图形生成和输出的流水线?
答:见课本 P13 页 1.5.6.节。
9、向量图形和点阵图形之间的区别有哪些?
答:通过矢量法产生的图形称为矢量图形或者向量图形,用描点法产生的图形称为点阵
图形。向量图形区别点阵图形的特点在于描述图形几何形状的数学模型及依据此模型生成几
何图形的计算机命令。向量图形由各个基本图形构成,这就要求各个基本图形有各自独立的
信息。如果用点阵图形来表示一个向量图形,构成向量图形的某个基本图形(如直线段、圆
弧等)的所有点应有一个信息。因此,在描述一个基本图形时,同时要描述其相应的信息。
向量图形最基本的优点是它本身是由精确的数据给出,所以可以充分利用各种输出图形设备
的分辨率尽可能精确地输出图形。也正因为如此,向量图形的尺寸可以任意变化而不损失图
形显示的质量。但是向量图形仅适合于描绘简单图形,而点阵图形可以描绘绚烂多彩的复杂
图形。
10、什么是虚拟现实技术和可视化技术?
答:虚拟现实技术:利用计算机生成一种模拟环境,通过多种传感器和设备使用户“投
入”到该环境中,实现用户和该环境直接进行交互的技术。例如模拟飞机驾驶舱。
可视化技术:通过对空间数据场构造中间几何因素,或用图形绘制技术在屏幕上产生二
维图像。例如分子模型构造。
第二章
1、计算机图形系统有什么特点?有哪些主要功能?
答:课本 2.1.1 的图 2.1 展示了计算机图形系统的组成。计算机图形系统是为了支持应
用程序,便于实现图形的输入输出的硬件和软件组合体。没有图形系统支持,就难以实现应
用软件的开发。主要功能见课本 2.1.2 节。
2、计算机图形系统有哪几种?各有什么特点?
答:一种分类方法:交互式图形系统允许操作者以某种方式(对话方式或命令方式)来控
制和操作图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。而被
动式绘图系统,图形在生成过程中,操作者无法对图形进行实时操作和控制,不具备交互功
能,只提供各种图形命令或图形程序库,通过编程获得所需图形。
另一种分类方法:见课本 2.1.3 节,分为脱机绘图系统、联机绘图系统和交互式绘图系
统。
3、阴极射线管由哪些部分组成?它们的功能分别是什么?
答:CRT 由四部分组成:电子枪、聚焦系统、偏转系统和荧光屏,这四部分都在真空
管内。电子枪由灯丝、阴极和控制栅极组成。灯丝加热阴极,阴极表面向外发射自由电子,
控制栅控制自由电子是否向荧光屏发出,若允许电子通过,形成的电子流在到达屏幕的途中,
被聚焦系统(电子透镜)聚焦成很窄的电子束,由偏转系统产生电子束的偏转电场(或磁场),
使电子束左右、上下偏转,从而控制荧光屏上光点上下、左右运动,使得在指定时刻在屏幕
指定位置上产生亮点。
4、光栅扫描显示器由哪些部分组成?它们的功能分别是什么?
—2—
答:见课本 P21 页图 2.9 所展示的组成框图,其后有各部分的介绍及功能。
5、对于分辨率为 1024*1024 的光栅系统,若每一像素用 8 位和 12 位二进制来表示存储信息,
各需多大光栅存储容量以及显存?每一屏幕最多能显示多少颜色?若 R,G,B 灰度都占 8
位,其显示颜色的总数是多少?
解:
1)每一像素用 8 位二进制来表示存储信息,所需容量为 1024*1024*1= 202 (Byte)=1MB
彩色素: 82 =256(项)
2)若每一像素用 12 位二进制表示存储信息,所需容量为:1024*1024*1.5=1.5* 202 (Byte)
=1.5MB (由于显示卡的显存是按 2 的指数次倍增长的,因此所需显存为 2M)
彩色素: 122 =4096( 项)
3)颜色总数:28 *28 *28 =224 =16777216(种)
6、对于 19 英寸显示器,若 X 和 Y 两方向的分辨率相等,即 1024*1024,那么每个像素点
的直径是多少?
解:
4.25*19
1024
2
=0.33(mm)或
19
1024
2
=0.013(英寸)
7、对于分辨率为 1024×768 的光栅系统,若调色板设置为真彩色 32 位,此时需要显示一个
三维图形,各需要多大光栅存储容量以及显存?
答:调色板为真彩色 32 位,即意味着像素值的位长为 32
所需容量为 1024*768*32/8*3=9MB 因此所需要的显存为 16M
8、GKS 有哪三种坐标系?它们有什么不同?试写出它们之间对应关系?
答:GKS 有 3 种不同的坐标系。第一种是供应用程序使用的实际世界坐标系统(World
Coordinate System,简称 WC);第二种是 GKS 内部使用的规范设备坐标系(Normalized
Device Coordinate,简称 NDC),它的取值范围为[0,1],这是一种既与设备无关也与应用
无关的坐标系;第三种是各工作站物理设备使用的设备坐标系(Device Coordinate System,
简称 DC)。GKS 只支持二维对象的图形处理,因此上述 3 个坐标系都是二维坐标系。详
见课本图 3.28 的描述。
9、GKS 中输入设备有哪 6 种逻辑功能?请各举出对应的物理设备。
答:见课本 2.4.5.节。
10、当前主流的图形软件有哪些?
答:见课本 2.6.3 节。
第三章
1、编写画一正方形程序,并在其中用不同的颜色画 15 个正方形,每一个都比前一个小。
—3—
#include“graphics.h”
#include“conio.h”
void main()
{
int i,color=0,ls=0;
int j=700;
int gdriver=VGA;
int gmode=VGAHI;
initgraph(&gdriver,&gmode,””);
setbkcolor(15);
for(i=0;i<225;i=i+15, j=j-30)
{
setcolor(color);
bar(i,i,j,j);
color++;
ls++;
}
getch();
closegraph();
}
2、用不同的线形绘制题 1 中的图形
#include“graphics.h”
#include“conio.h”
void main()
{
int i,color=1,ls=0;
int j=700;
int gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode,””);
setbkcolor(15);
for(i=0;i<=225;i=i+15, j=j-30)
3-1 批改说明;
必须至少包含"graphics.h"
initgraph(&gdriver,&gmode,"");
必须包含 15 个正方形,一般用 for 循环,也
可能用到 while 等。
注 意 查 看 是 否 是 正 方 形 ( i, i, j, j ) 即 :
x2-x1=y2-y1
注 意 查 看 颜 色 是 否 有 15 种 : 也 就 是 说
gdriver=CGA 肯定是错的,可以为 DETECT、
VGA、EGA。
3-2 批改说明;
注意查看 3_1 部分内容
setlinestyle((i%4),0,k);
k 对线宽的设置。
{
}
填充的情况
setcolor(color);
//setlinestyle(ls%4,0,1); 或者
setlinestyle(4,ls,3);
rectangle(i,i,j,j);
setfillstyle(SOLID_FILL,color);
//floodfill(getmaxx()/2,getmaxy()/2,color); 此句会出现最后只用一种颜色
color++;
ls++;
—4—
getch();
closegraph();
}
3、画一五颜六色的图(此例为画一个五颜六色的圆)
#include“graphics.h”
#include“conio.h”
void main()
{
int driver=DETECT,mode=0;
int i,start,end;
initgraph(&driver,&mode,””);
start=0;
end=20;
for(i=0;i<18;i++)
{
setfillstyle(SOLID_FILL,i);
pieslice(300,200,start,end,100);
start+=20;
end+=20;
}
getch();
restorecrtmode();
}
3-3 批改说明;
必须至少包含"graphics.h"
initgraph(&gdriver,&gmode,"");
如果是这个版本的图,注意 end 比 start
要大。
restorecrtmode() 可 能 有 人 写 成
retorecrtmode()
4、编写一辆自行车在一公路上由右至左快速行驶的程序。
#include"stdlib.h"
#include"graphics.h"
#include"conio.h"
#include"stdio.h"
void main()
{
void *w;
int driver=DETECT,mode=0,i,start,end,j;
initgraph(&driver,&mode," ");
cleardevice();
setbkcolor(15);
setcolor(CGA-LIGHTGREEN);
start=0;
end=180;
circle(387,290,37);
circle(525,290,37);
line(404,217,398,230);
line(436,217,429,230);
—5—
line(398,230,429,230);
line(413,230,387,290);
line(387,290,525,290);
line(408,243,484,243);
line(387,290,484,243);
line(484,243,525,290);
line(444,290,484,243);
line(444,290,446,279);
line(444,290,443,300);
line(438,277,444,278);
line(435,300,451,301);
line(484,243,487,233);
line(472,233,502,233);
w=malloc(imagesize(350,200,562,327));
getimage(350,200,562,327,w);
//自行车基本轮廓的绘制
for(i=350,j=0;i>0;i--,j--)
{
setfillstyle(EMPTY_FILL,0);
pieslice(387+j,290,start,end,37);
pieslice(525+j,290,start,end,37);
start+=40;
end+=40;
delay(5);
putimage(i-1,200,w,COPY_PUT);
line(2,327,562,327);
delay(10);
//处于运动状态的自行车车轮的轴线的绘制
//自行车行驶动画的实现
}
for(i=0;i<10;i++)
{
pieslice(37,290,start,end,37);
pieslice(175,290,start,end,37);
start+=40;
end+=40;
//处于静止状态的自行车车轮的轴线的绘制
}
getch();
restorecrtmode();
closegraph();
}
5、试自行设计一个美术图案,并且用程序实现。
(略)
第四章
—6—
1. 为什么说直线生成算法是二维图形生成技术的基础?
答:无论什么复杂图形,它们都是由直线段和曲线段组成(三维图形经投影后最终变成了二
维图形),而图形设备显示曲线段时,最终还是将曲线段转化成一系列直线段逼近表示的。
因此,所有图形都可以看成是由直线段组成的。可参考课本图 4.1。
2. 根据 DDA 画直线算法,遍一程序求(0,0)到(4,12)和(0,0,)到(12,4)的直
线
#include “graphics.h”
#include “math.h”
void DDA_Line(int x1,int y1,int x2,int y2)
{
float increx,increy,x,y,length;
int i;
if(abs(x2-x1)>abs(y2-y1))
length=abs(x2-x1);
else
length=abs(y2-y1);
increx=(x2-x1)/length;
increy=(y2-y1)/length;
x=x1;
y=y1;
for(i=1;i<=length;i++)
{
putpixel(x,y,1);
x=x+increx;
y=y+increy;
}
}
void main()
{
int driver=DETECT,mode=0;
initgraph(&driver,&mode,””);
int x1=0,y1=0,x2=4,y2=12;
int x3=12,y3=4;
DDA_Line(x1,y1,x2,y2);
DDA_Line(x1,y1,x3,y3);
getch();
}
3. 根据逐点比较法编一程序画一段圆弧,其圆心为(0,0),圆弧两点为 A(5,0)、B(0,
5)
方法 1:顺 4 象限
#include "graphics.h"
—7—
#include "stdio.h"
#include "conio.h"
void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2);
void main()
{
int gdriver=CGA,mode=CGAC0;
initgraph(&gdriver,&mode," ");
ZDBJ_ARC(0,0,25,0,0,25);
getch();
closegraph();
}
void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2)
{
float f=0.0,F;
float dx=1,dy=1;
while(abs(x1-x2)>1)
{
if(f>=0)
{
x1=x1-dx;
y1=y1;
putpixel(x1,y1,1);
f=f-2*dx*(x1-x0)+dx*dx;
}
else
{
x1=x1;
y1=y1+dy;
putpixel(x1,y1,1);
f=f+2*dy*(y1-y0)+dy*dy;
}
}
}
方法 2:逆 4 象限
#include "graphics.h"
#include "stdlib.h"
#include "conio.h"
void ZDBJ_ARC(float x0,float y0,float x1,float y1,float x2,float y2);
void main()
{
—8—