计算机图形学期末复习题

更新时间:2023-09-15 17:37:01 阅读量: 资格考试认证 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

声 明

此文档属个人总结成果,完全根据老师所给复习题与范围总结而成。内容中存在错误在所难免,望大家自行更正,见谅。如若囫囵吞枣,不假思索,导致后果,恕本人概不负责,转载请附带此声明。 祝大家考试顺利!!

0954班XXXX

一 问答题

1. 什么是计算机图形学?

答: 计算机图形学是研究怎样用计算机生成、处理和显示图形的一门学科。

ISO定义:计算机图形学是研究通过计算机将数据转换为图形,并在专用设备上显示的原理、方法和技术

的学科。

2. 什么是图形?什么是图像?图形和图像主要有哪些区别?

答:图形:是用一个指令集合来描述的。这些指令集合构成一幅图的所有直线,圆,圆弧,矩形,曲线等的位置、维数和大小、形状、颜色。也被称为矢量图形或几何图形。

图像:是由描述图像中各个像素点的亮度与颜色的数位集合组成。也叫点阵图像或位图图像。 区别如下:

A 图形与分辨率无关,放大后不会失真;图形与分辨率有关,放大后会失真。 B 在文件存储方面,图像的文件一般比较大。而图形文件小得多。 3 计算机图形学的研究内容。

答:如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法,构成了计算机图形学的主要研究内容。

? 图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算

与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。 4 计算机图形系统的功能和组成。 答:功能(5个):计算功能;存储功能;输入功能;输出功能;交互功能。 组成:

5图形输出设备包括那两类?列举出你知道的输出设备。 答:显示器:画点设备;绘图仪:画线设备

6什么是光栅图形输出设备?

答:可以输出栅格图像的各类输出设备的统称。例如显示器,绘图仪等等。 7什么是图形的扫描转换?扫描转换的两个任务是什么?

答:在光栅设备上基本图形生成也被称为基本图形的扫描转换或光栅化。 图形的扫描转换的任务

a) 确定最佳逼近于该图形的一组象素

b) 按扫描线顺序,对这些象素进行写操作

8 列举出你知道的直线扫描转换的方法。答:DDA算法,中点画线算法,Bresenham画线算法

9 什么是增量算法?答:在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得,则称为增量算法。

10 什么是多边形的扫描转换?

答:光栅图形学的一个基本问题是把多边形的顶点表示转换为点阵表示。这种转换称之为多边形的扫描转换。 多边形的扫描转换本质是多边形填充。

11 什么是裁剪?为什么我们要在计算机图形学中研究裁剪算法?

答:确定图形中哪些部分落在显示区内,哪些部分落在显示区之外,以便只显示显示区内的那部分图形的方法叫做裁剪。研究裁剪可以有目的的研究图形的性质,形状等等。

12 一条直线和裁剪窗口之间的关系有几种?答:三种。线段完全可见;显然不可见;其他。 13 图形变换的本质是什么?怎样实现图形变换。 答:经过几何变换的图形具有以下两个特点:

a) 图形变化了,但原图形的构成规则(拓扑关系)没有改变;

b) 图形发生的变化,是因为其顶点位置(几何关系)的改变决定的。

实现图形变换的方法:平移,旋转,对称,错切,基本比例变换等

一.图形学原理

1. DDA算法的基本原理是什么?

答:是最直观的根据斜率的偏移程度,决定是以x为步进方向还是以y为步进方向。然后在相应的步进方向上,步进变量每次增加一个像素,而另一个相关坐标变量则为Y=kx+b,DDA算法是一种迭代的算法,也是增量算法。

DDA算法的核心:分析|K|的取值范围,如下:|K|<1时,y=y+k, x=x+1 ; |K|>1时,x=x+1/k ,y=y+1。 2. 中点画线算法的基本原理是什么?

答:假设确定象素点(xi ,yi)为选定的像素,则下一个像素只能是 (xi +1 ,yi)或(xi +1 ,yi+1),设M为这两点之间的中点通过M点与实现的位置关系确定下一像素的位置。

? M在直线的下方,取(x+1,y+1)为下一像素点 ? M在直线的上方,取(x+1,y)为下一像素点 直线的方程F(x,y)=y-kx-b=0将平面分为三个区域: ? F(x,y)=0点在直线上 ? F(x,y)>0点在直线的上方 ? F(x,y)<0点在直线的下方

3. Bresenham画线算法的基本原理是什么?

答:如果已经确定(xi,yi)为直线上的一点,那么下一点的坐标为

d值的计算 ? d初=0,

? 每走一步:d=d+k

? 一旦y方向上走了一步,d=d-1

4. 八分圆思想的基本原理是什么?

答:由于圆被定义为到给定中心位置(xc,yc)的距离为r的点集。圆心位于原点的圆有4条对称轴x=0,y=0,x=y,x=-y.若已知圆弧上一点(x,y),可以得到其关于4条对称轴的其他7个点,这种性质就是圆的八对称性。因此,只要扫描转换1/8圆弧,就可以用八对称性求出整个圆弧的像素集。 void circlePoint(int x, int y){

putpixel ( x, y); putpixel ( y, x); putpixel ( -y, x); putpixel ( -x, y); putpixel ( -x, -y); putpixel ( -y, -x); putpixel ( y, -x); putpixel ( x, -y); }

5. 中点画圆算法的基本原理是什么?

答:P为当前点亮象素,那么,下一个点亮的象素可能是P1(Xp+1,Yp)或P2(Xp +1,Yp -1)。 F(X,Y)=X2 + Y2 - R2 ,d的初值等于1.25-R有如下结论:

F(M)< 0则M在圆内-> 取P1 F(M)>= 0 则M在圆外-> 取P2

#include void wholeCircle(int x,int y,int x0,int y0){ #include putpixel( x+x0,y0+y,RED); #include putpixel( x+x0,-y+y0,RED); void wholeCircle(int x,int y,int x0,int y0); putpixel( -x+x0,y+y0,RED); MyC(int x0,int y0,int R){ putpixel( -x+x0,-y+y0,RED); double d; putpixel( y+x0,x+y0,RED); int x,y; putpixel( -y+x0,x+y0,RED); d=1.25-R;x=0;y=R; putpixel( y+x0,-x+y0,RED); wholeCircle(x,y,x0,y0); putpixel(-y+x0,-x+y0,RED); } while(x

6. 边填充算法的基本思想是什么?

答:对于每一条扫描线和每条多边形边的交点,将该扫描线上交点右方的所有像素取补。

7. 种子填充算法的基本思想是什么?

答:将区域的一点赋予指定的颜色,然后将颜色扩展到整个的区域的过程。种子填充算法要求整个区域是连通的。

8. 如果裁剪窗口的左下角坐标为(xmin,ymin),右上角坐标为(xmax,ymax),某点(x,y)在窗口内

的充分必要条件是什么? 答:(x,y)要符合的条件是:xmin <= x <= xmax ymin <= y <= ymax 代码如下:

if(x <= xmax && x>=xmin && y <= ymax && y>=ymin ) putpixel(x,y,c);

9. Cohen-Sutherland裁剪的基本思想是什么?

答:将窗口边线两边沿长,得到九个区域,每一个区域都用一个四位二进制数标识。

编码的顺序为:上,下,右,左。直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界的位置。

? 若P1P2完全在窗口内则code1=0,且code2=0 ? 若P1P2完全在窗口外则code1&code2≠0

? 其他情况在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

10 中点分割裁剪算法的基本思想是什么?

答:所谓中点分割算法实质上是采用对分查找法求交点。

将线段分割成相等的两段,然后对每一小段重复上述的检查,直至找到每段与窗口边界的交点或分割小段的长度充分小,可以视为一点时为止。

11 梁-barsekey算法的基本思想是什么?

答:使用直线的参数方程,把二维裁剪问题化为两次一维裁剪

参数u的算法

初始化线段交点的参数:u1=0,u2=1; 计算出各个裁剪边界的p、q值;

调用函数clipTest(),在函数中根据p、q来判断:是舍弃线段还是改变交点的参数。

? 当p<0时,参数r用于更新u1;(u1=max{u1,…,rk}) ? 当p>0时,参数r用于更新u2;(u2=min{u2,…,rk})

如果更新了u1或u2后,使u1>u2,则舍弃该线段。

当p=0且q<0时,因为线段平行于边界并且位于边界之外,

p、q的四个值经判断后,如果该线段未被舍弃,则裁剪线段的端点坐标由参数u1和u2的值决定。

? 当Δx≥0(或Δy≥0)时,称x=xL(y=yB)为始边, x=xR(y=yT)为终边。 ? 当Δx<0(Δy<0)时,称x=xL(y=yB)为终边, x=xR(y=yT)为始边。

12边裁剪是针对什么样的图形的裁剪算法?针对什么样的窗口,基本思想是什么?

? 答:每次用窗口的一条边界对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧

的顶点,删除外侧的顶点,同时,适时地插入新的顶点:即交点和窗口顶点,从而得到一个新的多边形顶点序列。

? 然后以此新的顶点序列作为输入,相对第二条窗边界线进行裁剪,又得到一个更新的多边形顶点序列。 ? 依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边形顶点序列即为所求的裁剪好了的

多边形。 13种子填充算法的算法分析(问答题)

答:1 有些像素会多次入栈,降低了算法的效率;同时栈结构也占用一定的存储空间。

2 递归执行,算法简单,但效率不高。区域内的每一像素都引起一次递归的调用,进栈出栈费时费内存。

二.应用题

1. 用DDA算法画一条直线,直线的起点为(0,0),直线的终点为(5,2)。

K=2/5=0.4 x y y+0.5 0 0 0.5 1 0.4 0.9 2 0.8 1.3 3 1.2 1.7 4 1.6 2.1

5 2.0 2.5 画图省略

2. 用Bresenham画线算法画一条直线,直线的起点为(0,0),直线的终点为(5,2)

d=0 ,k=0.4

xi yi 第一次d 第二次d 0 0 0 0 1 0 0.4 0.4 2 1 0.8 -0.2 3 1 0.2 0.2 4 2 0.6 -0.4

5 2 0 画图过程省略

3 用中点画线算法画出(0,0)到(5,2)的一条直线 答:dx=5 ,dy=2 d的初始值是dx-2dy=1 若d<0 ,(x,y)更新为(x+1,y+1),则d的增量为2(dx-dy)=6 若d>0,(x,y)更新为(x+1,y),则d的增量为 -2dy= -4 X y d 0 0 1 1 0 -3 2 1 3 3 1 -1 4 2 5

5 2 画图过程省略

4用Bresenham画线算法画一条直线,直线的起点为(0,0),直线的终点的x坐标为你的学号对5求余,y坐标为对8求余(如果为0,x坐标加3,y坐标加5)。 答:12%5=2 12%8=4 ,因此画(0,0)到(2,4)的直线

做法同上 省略

5写出下图的新边表,并写出扫描线2的活化边表。

6 画出针对下面的多边形采用边填充算法后每一步的填充情况。

题有错误!!!

填充过程省略,详见ppt,白给分的题!!!

7 已知窗口左下角坐标(50,50),右上角坐标(400,400)。Cohen-Sutherland裁剪算法的编码图如

下。直线的端点坐标P1(40,100)和P2(500,420),请参照编码图示,求出P1和P2所在区域的分区代码C1和C2。说出P1P2的 裁剪过程。

Cohen-Sutherland算法代码:

void CS_LineClip(float x1,float y1,float x2,float y2){ code1=encode(x1,y1); code2=encode(x2,y2); while(code1!=0 ||code2!=0){ if((code1&code2)!=0) return; code = code1;

if(code1==0) code = code2; ……(求交点)

if(code ==code1){ x1=x; y1=y; code1 =encode(x,y);} else

{ x2=x; y2=y; code2 =encode(x,y); } }

setcolor(4);

line(x1,y1,x2,y2); }

8 直线的编码裁剪算法中,直线P1 P2的编码分别为C1 和C2。分别就下面两种情况,说明直线P1 P2与裁

剪窗口的关系。 1)C1= =0并且C2= =0. p1p2完全在窗口内,即线段完全可见

2)(C1&C2)= =0。属于其他情况

3)(C1&C2) !=0。 p1p2显然不可见

9 已知窗口左边界XL=100,线段端点P1(50,110), P2(200,200),求线段与窗口左边界的交点。

10 用中点分割算法求直线与窗口边界的交点时,假如直线的长度为64,那么最多求交多少次?

11 分析直线B采用梁-baskey算法对直线进行裁剪过程的。

12 按逐边裁剪算法对四边形ABCD进行裁剪,每次选择窗口的一条边对图形进行裁剪,选择的顺序有多种情

况,下面列了其中的六种。用你的学号对6求余然后加1,选择得到的数字对应的情况,例如如果你的学号 为11,对6求余值为5,则你选择第6种情况,即按左上右下的顺序进行裁剪。将每次裁剪的情况画出来,并写明对应的字符序列。 窗口的情况:(1)上下左右(2)左右上下(3)上左下右(4)左下右上(5)上右下左(6)左上右下

你的学号为 12 a的值为

13 分析针对任意点的比例(旋转/对称)变换的过程,写出变换矩阵。 三.编程题

1. 写出八向联通的种子填充算法的程序。

void FloodFill8(int x,int y,int fillcolor, int edgelolor){

int current;

current=getpixel(x,y);

if((current!=edgecolor)&& (current!=fillcolor)){ putpixel(x,y,fillcolor);

FloodFill8(x+1,y,fillcolor,edgecolor); FloodFill8(x-1,y,fillcolor,edgecolor); FloodFill8(x,y+1,fillcolor,edgecolor); FloodFill8(x,y-1,fillcolor,edgecolor);

后面还有4句

} }

2. 写出八分圆思想的代码。

void circlePoint(int x, int y){

putpixel ( x, y); putpixel ( y, x); putpixel ( -y, x); putpixel ( -x, y); putpixel ( -x, -y); putpixel ( -y, -x); putpixel ( y, -x); putpixel ( x, -y); }

3. 编写代码,调用C语言的图形函数,画一组同心圆,同心圆的圆心座标为(320,240),半径从50到500,

同心圆的个数为10。

#include circle(320,240,200); main( ){ circle(320,240,240); int gd=DETECT,gm; circle(320,240,300); initgraph(&gd,&gm,\ circle(320,240,350); circle(320,240,50); circle(320,240,450); circle(320,240,80); circle(320,240,500); circle(320,240,100); getchar( ); circle(320,240,150); closegraph( ); }

4. 边标志算法的代码 EdgeMarkFill(int p[][2],int n,int bcolor,int fcolor){ int i,x,y,flag,xmin,xmax,ymin,ymax; /*求出xmin,xmax,ymin,ymax;*/ for(y=ymin;y<=ymax;y++) { flag=-1;

for(x=xmin;x<=xmax;x++){ if(getpixel(x,y)==bcolor)

flag=-flag;

if(flag==1)

putpixel(x,y, fcolor); } } } 5. 编写代码,写出按上下左右的原则,对点进行Cohen-Sutherland编码。 #include return c; } #include void CS_LineClip(int x1,int y1,int x2,int y2){ #define LEFT 1 int code1,code2,code,x,y; #define RIGHT 2 code1=encode(x1,y1); #define BOTTOM 4 code2=encode(x2,y2); #define TOP 8 while(code1 !=0||code2 !=0){ #define XL 120 if((code1&code2)!=0) return; #define XR 400 if(code1!=0) code=code1; #define YB 130 else #define YT 230 code=code2; int encode(float x,float y){ if((LEFT & code)!=0){ int c=0; x=XL; if(xXR) x=XR; c|=RIGHT ; y=y1+(y2-y1)*(XR-x1)/(x2-x1); } if(yYT) x=x1+(x2-x1)*(YB-y1)/(y2-y1); } c|=TOP; else if((TOP & code)!=0){

本文来源:https://www.bwwdw.com/article/9qth.html

Top