2022年《计算机图形学》练习题.pdf
计算机图形学练习题( 答案 ) 计算机图形学练习题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 u1, 则线段就是可见的第四步 : 利用 u1 与 u2 计算端点坐标(3)比较 : Cohen-Sutherland:直观方便 , 速度较快多次重复计算线段与裁剪窗口边界的交点, 计算量大采用位逻辑乘 , 在有些高级语言中不便进行全部舍弃的判断仅适用于那些仅在窗口的线段, 不适合跨越三个区域的线段 , 就不能一次做出判别Liang-Barsky:所需计算量小 , 更有效可以扩展成三维裁剪算法只能应用于矩阵窗口的情形10. 简述 Bezier曲线与 B-Spline曲线的异同点 , 指出她们的特点与不足。11. DDA算法与 Bresenham 算法就是两种直线生成的基本算法, 试述两种算法的基本原理, 并分析它们的优点与不足。(1)DDA算法: 选定 x2x1 与 y2y1 中较大者作为步进方向( 假设 x2x1 较大 ), 取该方向上的增量为一个象素单位 ( x=1), 利用式 (2 1) 计算另一个方向的增量( y=x m=m) 。通过递推公式(2 2) 至 (25), 把每次计算出的 (xi+1,yi+1)经取整后送到显示器输出, 则得到扫描转换后的直线。之所以取 x2x1 与 y2y1 中较大者作为步进方向, 就是考虑沿着线段分布的象素应均匀,这在下图中可瞧出。另外 , 算法实现中还应注意直线的生成方向, 以决定 x 及 y 就是取正值还就是负值。(2)Bresenham 算法: 假定直线斜率k 在 01 之间。此时 , 只需考虑 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算法 :算法简单 ,实现容易由于在循环中涉及实型数的运算, 因此生成直线的速度较慢。浮点数运算不易硬件实现精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 7 页,共 9 页 - - - - - - - - - - 计算机图形学练习题( 答案 ) 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 来存储其深度信息。如果显示分辨率为12801024,那么深度缓冲器需要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 提供了强大的但就是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 8 页,共 9 页 - - - - - - - - - - 计算机图形学练习题( 答案 ) 开始。 Glu 为了减轻繁重的编程工作,封装了 OpenGL 函数 ,Glu 函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作。(3)OpenGL 辅助库包含有 31 个函数 ,函数名前缀为aux。这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。(4)OpenGL 工具库 OpenGL Utility Toolkit 包含大约30 多个函数 ,函数名前缀为glut。 glut 就是不依赖于窗口平台的OpenGL 工具包 ,由 Mark KLilgrad在 SGI 编写 ,目的就是隐藏不同窗口平台API 的复杂度。函数以glut 开头 ,它们作为aux 库功能更强的替代品,提供更为复杂的绘制功能精品资料 - - - 欢迎下载 - - - - - - - - - - - 欢迎下载 名师归纳 - - - - - - - - - -第 9 页,共 9 页 - - - - - - - - - -