图形学第七章习题答案.doc_第1页
图形学第七章习题答案.doc_第2页
图形学第七章习题答案.doc_第3页
图形学第七章习题答案.doc_第4页
图形学第七章习题答案.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题7.1 为什么需要隐藏面消隐算法?答: 因为我们在用计算机生成三维物体的真实感图形,必须要做的是确定物体的可见部分,只有确定了物体的可见部分,我们才能在计算机中真实地再现三维物体。因此,我们就需要一个隐藏面消隐算法来去掉物体的不可见部分,从而避免错误地将不可见部分显示出来,这样就可以在计算机中生成一个三维物体的真实感图形了。7.2 能否用多边形相邻两条边决定的向量积来确定内法线方向?为什么?答: 可以。 设多边形F的顶点为,顶点的次序要求这样排列,使观察者在多面体外沿着走时,多边形的内部始终在观察者的右侧。(定义) 对顶点进行分类,分为凸点集合A和凹点集合B,对于点:如果属于集合A,则F的内法线方向定义为;如果属于集合B,则F的内法线方向定义为;7.3 已知点和一个视点,确定从点观察时,哪个点遮挡了其它点。 答:连接观察点和点的直线是: 为了判断是否在这条直线上,可以将点带入方程,得时 ,在时 ,所以在过点和点的投影线上。 接着以为基准,判断哪个点在前面。,分别在这条线的 位置上。由值可知,在前面,即遮挡了。 现在判断是否在这条线上。时。所以不在这条投影线上,既没有遮挡、,也没有被、遮挡。7.4 设投影中心为原点,构造一个由透视投影到平行投影的变换。此变换使得原物体平行投影在平面上和将原物体透视投影在规范化视见平面上产生的图像相同。 答: 原物体在平面上的透视投影是: 其中,。点在视见平面上的透视投影是: 透视投影到平行投影变换为: 这里,是规范化前裁剪平面的位置。 现在,对点应用变换,得到点: 在平面上的平行投影为: 所以和产生相同的投影图像。而且,变换将以为边界的规范化透视视见体变换到以为边界的长方体上。7.5 如图7.14所示,如果视图平面法向量为(1,-2,-1),试写出它的一个显示排列。答: 因为这种排列方式只有第一项和第八项是确定的,所以该排列为 (1,*,*,*,*,*,*,6),其中*可以任意排列。7.6 z缓冲器算法是怎么判断哪个面应消隐的?答: 缓冲器算法设置了一个二维数组,类似于帧缓冲器。但是缓冲器存放的是每个象素点的深度值,而不是帧缓冲器中的颜色值。缓冲器的初始值为某个大的数值,通常是后裁剪平面的距离。在判断像素上的哪个平面更靠近观察者时,就可以简单地比较缓冲器中的深度值和当前平面的深度值。如果当前平面的值比缓冲器中的值小(即距视点更近),则用新值替换原缓冲器中的值,像素的颜色值也变成新平面的颜色值。7.7 基本扫描线方法如何判断哪个面需要消隐?答:基本思想:从最上面的一条扫描线开始工作,向下对每一条扫描线进行处理。在处理当前扫描线时,开一个一维数组作为当前扫描线的Z-buffer。首先找出与当前扫描线相关的多边形,以及每个多边形中相关的边对。对每一个边对之间的小区间上的各象素,计算深度,并与Z-buffer中的值比较,找出各象素处可见平面,计算颜色,写帧缓存。对深度计算,采用增量算法。7.8 编写一个程序实现7.5节中的油画家算法。 答: Void paint() /设多边形已保存在链表m_AllPoly中; /m_AllPoly定义:list m_AllPoly800; int i,k,j,num; /i,k,j临时整形变量,num纪录链表m_AllPoly中多边形的个数; float zmin; /临时变量,设置一个最小值; float temp; /临时变量; bool tag; int Priority /记录优先级的临时变量; /为临时变量赋初值 zmin = -65536; tag = TRUE; Priority = 1; /第一步:根据每个多边形顶点z坐标的极小值zmin的大小,按由小到大对它们做初步排序 /利用冒泡排序 for (j = 1; j = num; j+) for (i = j; i m_AllPolyi.zmin) / m_AllPolyi.zmin为链表中第i个多边形z最小值 zmin = m_AllPolyi.zmin; k = i; /纪录当前多边形; /if /for i /按照从小到大排序,找到第j个多边形m_AllPolyk,将m_AllPolyj与/m_AllPolyk交换位置。 temp = m_AllPolyj; m_AllPolyj = m_AllPolyk; m_AllPolyk = temp; /for j i = 1; while(num 1) /第二步:若链表中只有一个多边形,则算法结束。否则取表头多边形P(即m_AllPoly1)。 /首先,判断P的z的最大值是否比链表中任一多边形Q的z坐标值的最小值小。用布/尔变量tag作为标志。如果为TRUE,说明成立;否则不成立。 while(i = m_AllPolyi.zmin) tag = FALSE; k = i; /纪录不符合条件,导致tag变为FALSE的多边形。 i+; / while(i = num & tag) if(tag) /如果满足条件,则P不会遮挡其它多边形,为优先级最低的多边形,在链表中去除P m_AllPoly1.Priority = Priority; Priority+; /删除P,所有多边形前移; for ( i = 1;i num; i+) m_AllPolyi = m_AllPolyi+1; num-;/链表中多边形个数减1; / if(tag) else /否则,看是否满足4项条件之一,仍然用tag作标志。 tag = TURE; i = k; /从不满足条件的多边形开始判断 while(i = num & tag) if(OXYBoxIntersect(m_AllPoly1, m_AllPolyi)&(!(ViewFar(m_AllPoly1, m_AllPolyi)&(!(ViewNear(m_AllPolyi, m_AllPoly1)&(OXYIntersect(m_AllPoly1, m_AllPolyi) /4个条件 / OXYBoxIntersect(P, Q)表示两个多边形P和Q在OXY平面投影边界盒相交; /(ViewFar(P,Q)表示P的各顶点均在Q的远离视点的一侧; / ViewNear(Q,P)表示Q的各顶点均在P的靠近视点的一侧; / OXYIntersect(P,Q)表示P和Q在OXY平面上的投影不相交。 tag = FALSE; k = i;/纪录不符合条件的多边形。 /if if(tag) /若所有Q都满足下面四项条件中的一项,则在链表中去除P m_AllPoly1.Priority = Priority; Priority+; /删除P,所有多边形前移; for ( i = 1;i num; i+) m_AllPolyi = m_AllPolyi+1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论