计算机图形学教程课后习题参考答案Word文件下载.docx

上传人:b****5 文档编号:18676950 上传时间:2022-12-31 格式:DOCX 页数:79 大小:421.33KB
下载 相关 举报
计算机图形学教程课后习题参考答案Word文件下载.docx_第1页
第1页 / 共79页
计算机图形学教程课后习题参考答案Word文件下载.docx_第2页
第2页 / 共79页
计算机图形学教程课后习题参考答案Word文件下载.docx_第3页
第3页 / 共79页
计算机图形学教程课后习题参考答案Word文件下载.docx_第4页
第4页 / 共79页
计算机图形学教程课后习题参考答案Word文件下载.docx_第5页
第5页 / 共79页
点击查看更多>>
下载资源
资源描述

计算机图形学教程课后习题参考答案Word文件下载.docx

《计算机图形学教程课后习题参考答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学教程课后习题参考答案Word文件下载.docx(79页珍藏版)》请在冰豆网上搜索。

计算机图形学教程课后习题参考答案Word文件下载.docx

8、简述三维图形生成和输出的流水线?

见课本P13页1.5.6.节。

9、向量图形和点阵图形之间的区别有哪些?

答:

通过矢量法产生的图形称为矢量图形或者向量图形,用描点法产生的图形称为点阵图形。

向量图形区别点阵图形的特点在于描述图形几何形状的数学模型及依据此模型生成几何图形的计算机命令。

向量图形由各个基本图形构成,这就要求各个基本图形有各自独立的信息。

如果用点阵图形来表示一个向量图形,构成向量图形的某个基本图形(如直线段、圆弧等)的所有点应有一个信息。

因此,在描述一个基本图形时,同时要描述其相应的信息。

向量图形最基本的优点是它本身是由精确的数据给出,所以可以充分利用各种输出图形设备的分辨率尽可能精确地输出图形。

也正因为如此,向量图形的尺寸可以任意变化而不损失图形显示的质量。

但是向量图形仅适合于描绘简单图形,而点阵图形可以描绘绚烂多彩的复杂图形。

10、什么是虚拟现实技术和可视化技术?

虚拟现实技术:

利用计算机生成一种模拟环境,通过多种传感器和设备使用户“投入”到该环境中,实现用户和该环境直接进行交互的技术。

例如模拟飞机驾驶舱。

可视化技术:

通过对空间数据场构造中间几何因素,或用图形绘制技术在屏幕上产生二维图像。

例如分子模型构造。

第二章

1、计算机图形系统有什么特点?

有哪些主要功能?

课本2.1.1的图2

2、计算机图形系统有哪几种?

各有什么特点?

一种分类方法:

交互式图形系统允许操作者以某种方式(对话方式或命令方式)来控制和操作图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。

而被动式绘图系统,图形在生成过程中,操作者无法对图形进行实时操作和控制,不具备交互功能,只提供各种图形命令或图形程序库,通过编程获得所需图形。

另一种分类方法:

见课本2.1.3节,分为脱机绘图系统、联机绘图系统和交互式绘图系统。

3、阴极射线管由哪些部分组成?

它们的功能分别是什么?

CRT由四部分组成:

电子枪、聚焦系统、偏转系统和荧光屏,这四部分都在真空管内。

电子枪由灯丝、阴极和控制栅极组成。

灯丝加热阴极,阴极表面向外发射自由电子,控制栅控制自由电子是否向荧光屏发出,若允许电子通过,形成的电子流在到达屏幕的途中,被聚焦系统(电子透镜)聚焦成很窄的电子束,由偏转系统产生电子束的偏转电场(或磁场),使电子束左右、上下偏转,从而控制荧光屏上光点上下、左右运动,使得在指定时刻在屏幕指定位置上产生亮点。

4、光栅扫描显示器由哪些部分组成?

见课本P21页图2.9所展示的组成框图,其后有各部分的介绍及功能。

5、对于分辨率为1024*1024的光栅系统,若每一像素用8位和12位二进制来表示存储信息,各需多大光栅存储容量以及显存?

每一屏幕最多能显示多少颜色?

若R,G,B灰度都占8位,其显示颜色的总数是多少?

解:

1)每一像素用8位二进制来表示存储信息,所需容量为1024*1024*1=

(Byte)=1MB

彩色素:

=256(项)

2)若每一像素用12位二进制表示存储信息,所需容量为:

1024*1024*1.5=1.5*

(Byte)=1.5MB(由于显示卡的显存是按2的指数次倍增长的,因此所需显存为2M)

=4096(项)

3)颜色总数:

*

=

(种)

6、对于19英寸显示器,若X和Y两方向的分辨率相等,即1024*1024,那么每个像素点的直径是多少?

=0.33(mm)或

=0.013(英寸)

7、对于分辨率为1024×

768的光栅系统,若调色板设置为真彩色32位,此时需要显示一个三维图形,各需要多大光栅存储容量以及显存?

调色板为真彩色32位,即意味着像素值的位长为32

所需容量为1024*768*32/8*3=9MB因此所需要的显存为16M

8、GKS有哪三种坐标系?

它们有什么不同?

试写出它们之间对应关系?

GKS有3种不同的坐标系。

第一种是供应用程序使用的实际世界坐标系统(WorldCoordinateSystem,简称WC);

第二种是GKS内部使用的规范设备坐标系(NormalizedDeviceCoordinate,简称NDC),它的取值范围为[0,1],这是一种既与设备无关也与应用无关的坐标系;

第三种是各工作站物理设备使用的设备坐标系(DeviceCoordinateSystem,简称DC)。

GKS只支持二维对象的图形处理,因此上述3个坐标系都是二维坐标系。

详见课本图3.28的描述。

9、GKS中输入设备有哪6种逻辑功能?

请各举出对应的物理设备。

见课本2.4.5.节。

10、当前主流的图形软件有哪些?

见课本2.6.3节。

第三章

1、编写画一正方形程序,并在其中用不同的颜色画15个正方形,每一个都比前一个小。

#include“graphics.h”

#include“conio.h”

voidmain()

{

inti,color=0,ls=0;

intj=700;

intgdriver=VGA;

intgmode=VGAHI;

initgraph(&

gdriver,&

gmode,””);

3-1批改说明;

●必须至少包含"

graphics.h"

●initgraph(&

gmode,"

"

);

●必须包含15个正方形,一般用for循环,也可能用到while等。

●注意查看是否是正方形(i,i,j,j)即:

x2-x1=y2-y1

●注意查看颜色是否有15种:

也就是说gdriver=CGA肯定是错的,可以为DETECT、VGA、EGA。

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中的图形

inti,color=1,ls=0;

3-2批改说明;

●注意查看3_1部分内容

●setlinestyle((i%4),0,k);

●k对线宽的设置。

gmode=VGAHI;

=225;

//setlinestyle(ls%4,0,1);

或者

setlinestyle(4,ls,3);

rectangle(i,i,j,j);

setfillstyle(SOLID_FILL,color);

//floodfill(getmaxx()/2,getmaxy()/2,color);

此句会出现最后只用一种颜色填充的情况

3、画一五颜六色的图(此例为画一个五颜六色的圆)

intdriver=DETECT,mode=0;

inti,start,end;

3-3批改说明;

●如果是这个版本的图,注意end比start要大。

●restorecrtmode()可能有人写成retorecrtmode()

driver,&

mode,””);

start=0;

end=20;

18;

i++)

{

setfillstyle(SOLID_FILL,i);

pieslice(300,200,start,end,100);

start+=20;

end+=20;

restorecrtmode();

4、编写一辆自行车在一公路上由右至左快速行驶的程序。

#include"

stdlib.h"

conio.h"

stdio.h"

void*w;

intdriver=DETECT,mode=0,i,start,end,j;

initgraph(&

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

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;

10;

pieslice(37,290,start,end,37);

pieslice(175,290,start,end,37);

}//处于静止状态的自行车车轮的轴线的绘制

getch();

restorecrtmode();

closegraph();

5、试自行设计一个美术图案,并且用程序实现。

(略)

第四章

1.为什么说直线生成算法是二维图形生成技术的基础?

无论什么复杂图形,它们都是由直线段和曲线段组成(三维图形经投影后最终变成了二维图形),而图形设备显示曲线段时,最终还是将曲线段转化成一系列直线段逼近表示的。

因此,所有图形都可以看成是由直线段组成的。

可参考课本图4.1。

2.根据DDA画直线算法,遍一程序求(0,0)到(4,12)和(0,0,)到(12,4)的直线

#include“graphics.h”

#include“math.h”

voidDDA_Line(intx1,inty1,intx2,inty2)

floatincrex,increy,x,y,length;

inti;

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;

=length;

putpixel(x,y,1);

x=x+increx;

y=y+increy;

}

intx1=0,y1=0,x2=4,y2=12;

intx3=12,y3=4;

DDA_Line(x1,y1,x2,y2);

DDA_Line(x1,y1,x3,y3);

3.根据逐点比较法编一程序画一段圆弧,其圆心为(0,0),圆弧两点为A(5,0)、B(0,5)

方法1:

顺4象限

#include"

voidZDBJ_ARC(floatx0,floaty0,floatx1,floaty1,floatx2,floaty2);

intgdriver=CGA,mode=CGAC0;

ZDBJ_ARC(0,0,25,0,0,25);

getch();

voidZDBJ_ARC(floatx0,floaty0,floatx1,floaty1,floatx2,floaty2)

floatf=0.0,F;

floatdx=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;

f=f+2*dy*(y1-y0)+dy*dy;

方法2:

逆4象限

ZDBJ_ARC(0,0,0,25,25,0);

while(abs(y1-y2)>

0)

y1=y1-dy;

f=f-2*dy*abs(y1-y0)+dy*dy;

x1=x1+dx;

f=f+2*dx*abs(x1-x0)+dx*dx;

方法3:

顺1象限

#include“graphics.h”//省略了图形初始化的步骤

intx1=5,y1=0,x2=0,y2=5;

intx0=0,y0=0;

intR=sqrt((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));

intdx=abs(x2-x1);

intdy=abs(y2-y1);

intn=dx+dy;

putpixel(x2,y2,1);

intf;

intx=x2,y=y2;

for(inti=0;

n;

f=(x-x0)*(x-x0)+(y-y0)*(y-y0)-R*R;

if(f>

putpixel(x,y--,1);

putpixel(x++,y,1);

}//另一种做法是采用课本P97页表4.2的公式

4.编一程序用角度DDA法画一圆//以圆点为圆心,半径为20的圆

#include“graphics.h”//省略了图形初始化的步骤

#include“conio.h”

intx0=0,y0=0,R=20;

intx1,y1,xi,yi;

intN=R*8;

floata=2*3.14/N;

x1=20,y1=0;

for(inti=1;

=N;

xi=x0+R*cos(i*a)

yi=y0+R*sin(i*a);

line(x1,y1,xi,yi);

x1=xi;

y1=yi;

5.如果线段端点坐标值不是整数,采用DDA算法产生的直线和将端点坐标值先取整后再用Bressenham算法产生的直线是否完全相同?

为什么?

能否扩充整数Bressenham算法使之能够处理当线段端点坐标值不是整数的情况。

不相同。

因为DDA算法总是选择△x或者△y中的较大者作为步进的方向,不失一般性,假设选择x方向,则x方向每前进一个像素点,y方向前进的像素点个数应该在[0,1]区间,但是由于采用了(向上或者向下或者四舍五入)取整运算,必然会导致某些像素点偏在了真实直线的一侧。

而Bressenham算法每一步都会根据实际直线与网格的距离来决定下一个像素点的选择,因此所选像素点更加贴近于真实的直线。

可以扩充整数Bressenham算法使之能够处理当线段端点坐标值不是整数的情况。

6.若采用Bresenham算法实现画圆,写出算法实现的具体流程(包括判别公式推导等等)。

给定圆心在原点,半径为R的圆,其方程为x2+y2=R2,构造函数F(x,y)=x2+y2-R2,对于圆上的点,有F(x,y)=0;

对于圆外的点,F(x,y)>

0;

而对于圆内的点,F(x,y)<

0。

此处仅考虑如图所示的第一象限内x∈

的1/8圆弧,此时中点Bresenham画圆算法要从(0,R)到(

)顺时针地确定最佳逼近于该圆弧的像素序列。

由于最大位移方向为x,因此其基本原理:

每次x方向上走一步,而y方向上或减1或减0。

假定当前与圆弧最近者已确定,为P(xi,yi),那么下一候选像素只能是正右方的Pu(xi+1,yi)和右下方的Pd(xi+1,yi-1)。

到底选取哪一个候选点依旧用中点进行判别。

假设M是Pu和Pd的中点,即有M(xi+1,yi-0.5),则当F(xM,yM)<

0,M在圆内,这说明Pu离圆弧更近,应取其为下一个像素点;

当F(xM,yM)>

0,M在圆外,说明Pd离圆弧更近;

当F(xM,yM)=0,则约定取Pd。

构造判别式di=F(xM,yM)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R2

(1)当di<

0,取Pu(xi+1,yi),计算下一步的的判别式

di+1=F(xu,yu)=F(xi+2,yi-0.5)=(xi+2)2+(yi-0.5)2-R2=di+2xi+3

所以沿正右方向,di的增量为2xi+3。

(2)当di

0,取Pd(xi+1,yi+1),计算下一步的的判别式

di+1=F(xd,yd)=F(xi+2,yi-1.5)=(xi+2)2+(yi-1.5)2-R2=di+2(xi-yi)+5

所以沿右下方向,di的增量为2(xi-yi)+5。

显然,所绘制圆弧段的第一个像素为P0(0,R),因此判别式d0的初始值为1.25-R,可以令d’=d-0.25来摆脱小数运算,则判别式di<

0对应于di<

-0.25,由于d始终是整数,di<

-0.25等价于di<

7.已知4个型值点(1.0,2.0),(2.5,3.5),(4.0,4.5),(5.0,4.0),求各段三次样条曲线。

Si(X)(i=1,2,3),设边界条件为抛物线端

m1=x2-x1=1.5,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1