《计算机图形学》练习题
1.直线扫描转换的Bresenham 算法
(1) 请写出生成其斜率介于0和1之间的直线的Bresenham 算法步骤。
(2) 设一直线段的起点和终点坐标分别为(1,1)和(8,5),请用Bresenham 算法生成此直线段,确定所有要绘制象素坐标。
(1)输入线段的两个端点,并将左端点存储在(x0,y0)中 将(x0,y0)装入帧缓存,画出第一个点
计算常量?x, ?y, 2?y, and 2?y-2?x,并得到决策参数的第一个值: p0 = 2?y - ?x
④从k=0开始,在沿线路径的每个xk 处,进行下列检测: {
如果pk < 0,下一个要绘制的点就是(xk +1,yk) ,并且pk+1 = pk + 2?y 否则下一个要绘制的点就是(xk +1, yk +1),并且 pk+1 = pk + 2?y- 2?x ⑤重复步骤4,共 ?x-1次 (2)m=(5-1)/(8-1)= ?x=7 ?y=4 P0=2?y-?x=1
2?y=8 2?y-2?x=-6
k pk
:
(xk+1,yk+1)
0 1 (2,2) 1 -5 (3,2) 2 3 (4,3) ! 3 -3 (5,3) 4 5 (6,4) 5 -1 (7,4)
6 / 7
(8,5)
2.已知一多边形如图1所示,其顶点为V 1、V 2、V 3、V 4、V 5、V 6,边为E 1、E 2、E 3、E 4、E 5、E 6。用多边形的扫描填充算法对此多边形进行填充时(扫描线从下到上)要建立边分类表(sorted edge table)并不断更新活化边表(active edge list)。
(1) 在表1中填写边分类表中每条扫描线上包含的边(标明边号即可); (2) 在表2中写出边分类表中每条边结构中各成员变量的初始值 (3) 指出位于扫描线y=6,7,8,9和10时活化边表中包含那些边,并写出这些边中的x 值、y max
值、和斜率的倒数值1/m 。
表1边分类表 x
/ 8 1
y
1 4
8 2 3 。
6 7 9 10 2 3 5 6 7 — 10
V 1
V 2
V 3 V 4
V 5 V 6 E 1
E 2
—
E
E 4
E 5 E 6
3. 二维变换
(1) 记P(xf,yf)为固定点,sx、sy分别为沿x轴和y轴方向的缩放系数,请用齐次坐标(Homogeneous Coordinate)表示写出二维固定点缩放变换的变换矩阵。
^
(2) 把以A(0,0)、B(1,1)和C(5,2)为顶点的三角形以顶点C为固定点放大2倍。求出放大后的三角形的顶点坐标。
(1)
(2)平移这个对象,使得他的固定点与原点重合 缩放这个在坐标原点的对象
平移这个对象,使得他的固定点回到原始位置
?????
???????????????
?--=??????????110
0)1(0)1(01''r r y f y x f x y x s y s s x s y x
所以 A(-5,-2) B(-3,0) C(5,2)
4二维变换 —
(1) 请用齐次坐标表示写出点Q(x,y)绕定点P(a,b)旋转的旋转变换矩阵。
(2) 求出以A(0,0)、B(1,1)和C(5,2)为顶点的三角形绕固定点P(-1,-1)点旋转450后的三角形的顶点坐标。 (1)
(2)平移这个对象,使得他的固定点与原点重合 旋转这个在坐标原点的对象
平移这个对象,使得他的固定点回到原始位置 {
?????
???????????????
?--+--=??????????110
0sin )cos 1(cos sin sin )cos 1(sin cos 1''y x x y y x y x r r r r θθθθθθθθ
A(-1,-1+2) B(-1,-1+22) C(-1+3/2*2,-1+9/2*2)
x ’=xr+(x- xr)cos θ -(y- yr)sin θ y ’=yr+(x- xr)sin θ +(y- yr)cos θ
5. 如图所示,
L(-3,1)和R(2,6)为正方形裁剪窗口两个对角线角点,线段AB 、CD 、EF 、GH 和IJ 为被裁剪线段。
用
Cohen-Sutherland 线裁剪算法进行裁剪时要对线段的端点进行编码。 (1) 请写出编码规则,并在图中标出相应区域的编码 ·
(2) 分别指出于点A 、B 、C 、D 、E 、F 、G 、H 对应的编码
(3) 根据线段端点的编码对图中所有线段分类,指出哪些线段是可见的哪些是不可见的哪些是候选的裁剪线段。
#
J(-2,10)
》
(1)
—
(2)
A:0001
B:1000
C:0000
D:1010
E:0000
F:0000
G:0100
H:0010
I:1000
—
J:1000
(3)
可见的:EF
不可见的:GH,IJ 候选的:AB,CD
#
6. 分别用Sutherland-Hodgman 算法和Weiler-Atherton 算法裁剪图1所示的多边形
p 1p 2p 3p 4p 5p 6p 7p 8p 9p 1,裁剪窗口为如图所示的矩形窗口。 要求:
(1) 用实线分别在图1(a)(b)(c)(d)中绘出用Sutherland-Hodgman 算法沿裁剪窗口的左、右、上、
下窗口边裁剪后的中间结果
(2) 用Weiler-Atherton 算法对图1所示的多边形进行裁剪,以p1为起点,以图1箭头所示
的方向为走向,在图1(e)中用箭头表示画出所有走过的边(包括多边形边和窗口边)及其走向;并在图1(f)中用实线绘出最后裁剪结果。
》
~
【
图1多边形裁剪
P 1
2
7 图1(a)
P 1
P 2
~
P 4 P 5
P 6 P 7
P 8
P 9
图1(b)
P 1 P 2
(
P 4 P 5
P 6 P 7
P 8
P 9 图1(c)
)
P 2
P 3
P 4
P 5
P 6 P 7
P 8
P 9
:
P 1
P 2
P 3
P 4 P 5
P 6 P 7
P 8
P 9
P 1
P 3
P 4
P 5
P 6 P 7
>
P 9
P 1
P 3
P 5
P 6 P 7
》
P 9
)
7.简述多边形扫描填充算法基本原理和大致步骤,并以具体例子说明边分类表内容、扫描过程中活化边表的信息变化。
(1)原理:
在直角坐标系中,假设有一条从左至右的扫描线穿过多边形,从左至右开始计数,与多边形交点为奇数时,开始进入多边形,与多边形交点为偶数时,走出多边形。这样在这相邻配对的奇偶交点间的所有象素都在多边形内。如图,奇数交点a,c,都是入多边形,偶数交点b ,d都是走出多边形,相邻的奇偶交点配对,a,b之间,c,d之间的象素都多边形内,可见一条扫描线上,与多边形交点个数需要为偶数。依据这样的思路,扫描线从上到下从左到右依次扫过多边形即可求得多边形所占据的象素。(注意退化情况的处理,也就是扫描线刚好经过顶点或者多边形的边本身就是水平的情况)
)
(2)步骤:
1)输入多边形的顶点的坐标
2)建立边表(ET)
3)初始化Y值
4)初始化活性边表(AEL),设置为空
5)每个扫描线从底部到顶部,做以下步骤直到ET和AEL是空的:
建立AEL
设置颜色
更新AEL:
当Y= YMAX时,删除边
【
x = x +?X
Y = y + 1
④返回AEL
(3)例子:
8.由坐标A(0,0,0),B(1,0,0),C(0,1,0),D(0,01)确定的锥体绕直线L旋转450,其中L的方向为V=J+K,且通过点C(0,1,0)。写出锥体旋转后的坐标。
9.设3次参数多项式函数P(u)=a u3+b u2+c u+d,求出满足下列边界条件的3次Hermite插值曲线(用矩阵表示):
P(0) = P k
?
P(1) = P k+1
P’(0) = DP k
P’(1) = DP k+1
直线段裁剪算法和Liang-Barsky直线段裁剪算法是直线段裁剪的两种基本算法,试述两种算法的基本原理,并分析它们的优点和不足。
(1)通过一个矩形的裁剪区域将整个屏幕分成9个部分,并为每一个部分赋予相应的区域码,然后根据端点的位置确定这个端点的区域码。先判断能否完全接受或者完全排除一条线段,若以上2个判断无法直接得出,则逐步裁剪,选取一个位于裁剪区外的端点,把端点的区域码和裁剪边界的区域码进行逻辑与运算,若结果为真,则端点在该裁剪边界外部,这时将端点移向线段和该边界的交点处,如此循环,直到裁剪结束。
(2)利用线段的参数表达形式直接判别落在窗口内的部分线段.
大体上有以下几步,有些步骤依据中间的判断结果可以省略或跳转.
第一步:计算出pk和qk(k=1,2,3,4)
第二步:看pki的符号进行判断
~
第三步:计算u1=max(0,qk/pk),u2=min(1,qk/pk)
如果,u2>u1,则线段是可见的
第四步:利用u1和u2计算端点坐标
(3)比较:
Cohen-Sutherland:直观方便,速度较快
多次重复计算线段与裁剪窗口边界的交点,计算量大
采用位逻辑乘,在有些高级语言中不便进行
全部舍弃的判断仅适用于那些仅在窗口的线段,不适合跨越三个区域的
线段,就不能一次做出判别
Liang-Barsky:所需计算量小,更有效
,
可以扩展成三维裁剪算法
只能应用于矩阵窗口的情形
10.简述Bezier曲线与B-Spline曲线的异同点,指出他们的特点和不足。
11.DDA算法和Bresenham算法是两种直线生成的基本算法,试述两种算法的基本原理,并分析它们的优点和不足。
(1)DDA算法:
选定x2-x1和y2-y1中较大者作为步进方向(假设x2-x1较大),取该方向上的增量为一个象素单位(△x=1),
利用式(2-1)计算另一个方向的增量(△y=△x·m=m)。通过递推公式(2-2)至(2-5),把每次计算出的(xi+1,yi+1)经取整后送到显示器输出,则得到扫描转换后的直线。
之所以取x2-x1和y2-y1中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。
④另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。
(2)Bresenham算法:
假定直线斜率k在0~1之间。此时,只需考虑x方向每次递增1个单位,决定y方向每次递增0或1。
设:直线当前点为(xi,y)
直线当前光栅点为(xi,yi)
则:下一个直线的点应为(xi+1,y+k)
下一个直线的光栅点为右光栅点(xi+1,yi)(y方向递增量0)或为右上光栅点(xi+1,yi+1)(y方向递增量1)
(3)优缺点:
DDA算法:算法简单,实现容易
由于在循环中涉及实型数的运算,因此生成直线的速度较慢。
浮点数运算
不易硬件实现
Bresenham算法:不必计算直线之斜率,因此不做除法;
不用浮点数,只用整数;
只做整数加减法和乘2运算,而乘2运算可以用硬件移位实现.
算法速度很快,并适于用硬件实现.
12.简述直线段裁剪与多边形裁剪的异同点。
多边形的剪裁比直线剪裁复杂。如果按照直线剪裁算法对多边形的边作剪裁,剪裁后的多边形的边就会成为一组彼此不连贯的折线,从而给填色带来困难。多边形剪裁算法的关键在于,通过剪裁,不仅要保持窗口内多边形的边界部分,而且要将窗框的有关部分按一定次序插入多边形的保留边界之间,从而使剪裁后的多边形的边仍然保持封闭状态,以便填色算法得以正确实现
13.在计算机辅助设计与图形学中,样条曲线通常采用3次多项式参数表示,请说明理由。
14.图形学中消隐算法有两大类,z缓冲器(z-buffer)算法属于哪一类请阐述它的基本原理和特点。
(1)属于图像空间消隐
(2)基本原理:
Z缓冲器中每个单元的值是对应象素点所反映对象的z坐标值。Z缓冲器中每个单元的初值取成z的极小值,帧缓冲器每个单元的初值可放对应背景颜色的值。图形消隐的过程就是给帧缓冲器和Z缓冲器中相应单元填值的过程。在把显示对象的每个面上每一点的属性(颜色或灰度)值填入帧缓冲器相应单元前,要把这点的z坐标值和z缓冲器中相应单元的值进行比较。只有前者大于后者时才改变帧缓冲器的那一单元的值,同时z缓冲器中相应单元的值也要改成这点的z坐标值。如果这点的z坐标值小于z缓冲器中的值,则说明对应象素已经显示了对象上一个点的属性,该点要比考虑的点更接近观察点。对显示对象的每个面上的每个点都做了上述处理后,便可得到消除了隐藏面的图
(3)特点:
优点:
(1)算法复杂度(O(nN)):对于给定的图像空间,N是固定的,所以算法复杂度只会随着场景的复杂度线性地增加
(2)无须排序:场景中的物体是按任意顺序写入帧缓冲器和z缓冲器的,无须对物体进行排序,从而节省了排序的时间
(3)适合于任何几何物体:能够计算与直线交点
(4)适合于并行实现(硬件加速)
不足:
(1)z缓冲器需要占用大量的存储单元:
一个大规模复杂场景中:深度范围可能为106,一个像素需要24bit来存储其深度信息。
如果显示分辨率为1280×1024,那么深度缓冲器需要4MB存储空间
(2)深度的采样与量化带来走样现象
(3)难以处理透明物体
解决存储问题:逐区域进行z缓冲器消隐(A-Buffer method: accumulation buffer)
16. OpenGL库函数由哪几部分组成,请简单说说各部分的分工。
(1)OpenGL核心库
核心库包含有115个函数,函数名的前缀为gl。
这部分函数用于常规的、核心的图形处理。
(2)OpenGL实用库The OpenGL Utility Library (GLU)
包含有43个函数,函数名的前缀为glu。
OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。
(3)OpenGL辅助库
包含有31个函数,函数名前缀为aux。
这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。
(4)OpenGL工具库OpenGL Utility Toolkit
包含大约30多个函数,函数名前缀为glut。
glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写,目的是隐藏不同窗口平台API的复杂度。函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能