计算机图形学CG07-二维观察_第1页
计算机图形学CG07-二维观察_第2页
计算机图形学CG07-二维观察_第3页
计算机图形学CG07-二维观察_第4页
计算机图形学CG07-二维观察_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第7章章 二维观察2本章目标l理解二维图形的绘制过程理解二维图形的绘制过程l图形裁剪方法图形裁剪方法l窗口到视区的变换窗口到视区的变换l学会使用学会使用OpenGL的显示函数的显示函数3主要内容l二维观察流水线二维观察流水线l窗口到视区的变换窗口到视区的变换lOpenGL二维观察函数二维观察函数l裁剪裁剪l直线段裁剪直线段裁剪l多边形裁剪多边形裁剪l字符裁剪字符裁剪47.1 二维观察流水线l几个概念几个概念n裁剪窗口裁剪窗口(Clipping Window) :需要显示的场景区域:需要显示的场景区域u又称为世界窗口或观察窗口,简称又称为世界窗口或观察窗口,简称窗口窗口u在世界坐标系(又称用

2、户坐标系)内定义在世界坐标系(又称用户坐标系)内定义n视口视口(Viewport):指显示设备上用来显示图形的区域:指显示设备上用来显示图形的区域u又称又称视区视区,在设备(屏幕)坐标系内定义,在设备(屏幕)坐标系内定义n裁剪裁剪(Clip):从场景中确定位于窗口内的图形:从场景中确定位于窗口内的图形视口视口屏幕屏幕57.1 二维观察流水线l裁剪窗口和视区的关系裁剪窗口和视区的关系n改变视口位置可以在输出设备的不同位置上观察物体改变视口位置可以在输出设备的不同位置上观察物体n使用多个视口可以在屏幕不同的位置观察场景的不同部分使用多个视口可以在屏幕不同的位置观察场景的不同部分n改变窗口的尺寸达到

3、改变视口内显示对象的多少改变窗口的尺寸达到改变视口内显示对象的多少n改变视口的尺寸实现对象放缩改变视口的尺寸实现对象放缩67.1 二维观察流水线l二维观察变换二维观察变换n二维世界坐标系场景描述到设备坐标系的映射二维世界坐标系场景描述到设备坐标系的映射n又称为窗口到视区的变换或窗口变换又称为窗口到视区的变换或窗口变换l二维图形的观察流水线(显示流程)二维图形的观察流水线(显示流程)几何变换几何变换裁剪裁剪77.2 窗口到视区的变换l目标目标n将窗口之中的图形变换到视区中将窗口之中的图形变换到视区中l变换的计算变换的计算n变换的分解与合成变换的分解与合成n窗口窗口 (xmin, ymin) :

4、长度(长度(Ex); 宽度(宽度(Ey)n视区视区 (umin, vmin) : 长度(长度(Eu); 宽度(宽度(Ev)?87.2 窗口到视区的变换l步骤步骤n在世界坐标系中,平移使在世界坐标系中,平移使(xmin, ymin)至坐标原点,变换至坐标原点,变换为为T (xmin, ymin)n放缩使窗口的大小与视区相等,变换为放缩使窗口的大小与视区相等,变换为S(Eu/Ex, Ev/Ey)n在设备坐标系中,平移使窗口与视区重合,变换为在设备坐标系中,平移使窗口与视区重合,变换为T (umin, vmin)97.2 窗口到视区的变换l变换矩阵变换矩阵10000minminminminminmi

5、nminmin),(),(),(vEyEvyEyEvuExEuxExEuyxTEEEESvuTMyvxxwv注意注意: :这里不需要逆变换这里不需要逆变换107.3 OpenGL二维观察函数l流程流程n程序窗口程序窗口 裁剪窗口裁剪窗口 视区视区lGLUT显示窗口显示窗口n初始化:初始化:glutInit(&argc, argv); /参数与参数与main函数一致函数一致n位置:位置:glutInitWindowPosition(xTopLeft, yTopLeft);n大小:大小:glutInitWindowSize(dwWidth, dwHeight);n建立:建立:glutCre

6、ateWindow(“Title of Display Windows”);n模式:模式:glutInitDisplayMode(mode);u选择颜色和缓存选择颜色和缓存,如如GLUT_RGB|GLUT_SINGLEn背景颜色:背景颜色:glClearColor(red, green, blue, alpha)u参数与选择的颜色模式相关,取值在参数与选择的颜色模式相关,取值在0和和1之间之间117.3 OpenGL二维观察函数l投影模式投影模式nOpenGL专门为三维应用而设计,但可将三维观察函数应专门为三维应用而设计,但可将三维观察函数应用于二维观察用于二维观察n投影函数投影函数 glMa

7、trixMode(GL_PROJECTION); /指定投影矩阵为当前矩阵指定投影矩阵为当前矩阵 glLoadIdentity(); /初始化初始化lGLU裁剪窗口函数裁剪窗口函数n定义函数:定义函数:gluOrtho2D(left,right,bottom,top);n功能:将场景映射到屏幕的正交投影功能:将场景映射到屏幕的正交投影n参数为参数为4个平面(个平面(3维)维)n默认大小为(默认大小为(1,1,1,1)127.3 OpenGL二维观察函数lOpenGL视口函数视口函数n定义函数:定义函数:glViewport(xvmin,yvmin,vpwidth,vpheight);n视口为矩

8、形视口为矩形l在视口内绘制图形对象在视口内绘制图形对象n指定显示内容函数:指定显示内容函数:glutDisplayFunc(pictureDescrip)npictureDescrip为回调函数,主要绘制图形为回调函数,主要绘制图形l启动程序启动程序nglutMainLoop()137.3 OpenGL二维观察函数实例实例7-1#include #include #include class wcPt2D public: GLfloat x, y; ;void init (void) glClearColor (1.0, 1.0, 1.0, 0.0); /设置裁剪窗口设置裁剪窗口 glMatr

9、ixMode (GL_PROJECTION); gluOrtho2D (-100.0, 100.0, -100.0, 100.0); /几何变换矩阵模式几何变换矩阵模式 glMatrixMode (GL_MODELVIEW); 147.3 OpenGL二维观察函数实例实例7-1(续)(续)void triangle (wcPt2D *verts) GLint k; glBegin (GL_TRIANGLES); for (k = 0; k 0: max(xT, xB) = xT; min(xT, xB) = xBP0P1斜率斜率 K0? 0? 不是执行(不是执行(3 3),否则执行。),否则执

10、行。计算计算xT, , 测试测试 LL xT?若成立,计算?若成立,计算xB,测试,测试 xB RR?若成立,有可见线段:若成立,有可见线段: x = max(LL,xB B); x = min(RR,xT)n(3)(3)K0: :计算计算xB, ,测试测试 LL xB?若成立,计算?若成立,计算xT,测试,测试 xT R?若成立,有可见线段:?若成立,有可见线段: x = = max(LL , xT); x = = min(RR, xB)l特点特点n二维转化为一维二维转化为一维n按需求交点,提高效率按需求交点,提高效率7.5.5 Liang-Barsky417.6 多边形裁剪l错觉错觉n多边

11、形边界是直线段的组合,那么能否利用线段裁剪算多边形边界是直线段的组合,那么能否利用线段裁剪算法?法?n不能用不能用线段裁剪方法线段裁剪方法主多边形主多边形427.6 多边形裁剪l问题问题1)因为边界不再封闭,需要用窗口边界的恰当部)因为边界不再封闭,需要用窗口边界的恰当部分来封闭它,如何确定其边界?分来封闭它,如何确定其边界?裁剪结果多边形的边由裁剪多边形和主多边形裁剪结果多边形的边由裁剪多边形和主多边形的边(边的一部分)构成的边(边的一部分)构成432)一个凹多边形可能被裁剪成几个小的多边形,如何确定这)一个凹多边形可能被裁剪成几个小的多边形,如何确定这些小多边形的边界?些小多边形的边界?7

12、.6 多边形裁剪44lS-H算法基本思想算法基本思想n将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所将多边形关于矩形窗口的裁剪分解为多边形关于窗口四边所在直线的裁剪在直线的裁剪l步骤步骤n多边形由一系列顶点表示:多边形由一系列顶点表示:V1V2Vnn按一定按一定(左上右下左上右下)的次序依次裁剪的次序依次裁剪; 与左边所在直线裁剪的结与左边所在直线裁剪的结果是上边的输入,依次类推果是上边的输入,依次类推n输出为顶点序列输出为顶点序列7.6.1 Sutherland-Hodgman算法亦称亦称逐边裁剪算法逐边裁剪算法457.6.1 Sutherland-Hodgman算法l裁剪线裁剪裁剪线

13、裁剪n输入输出:顶点序列输入输出:顶点序列V0V1V2V3V4 .n多边形与窗口每条边的裁剪多边形与窗口每条边的裁剪u裁剪线:窗口边以及其延长线裁剪线:窗口边以及其延长线u内侧空间与外侧空间内侧空间与外侧空间l包含裁剪窗口的半空间为内侧空间,否则为外侧空间包含裁剪窗口的半空间为内侧空间,否则为外侧空间裁剪线裁剪线内侧空间内侧空间裁剪窗口裁剪窗口外侧空间外侧空间467.6.1 Sutherland-Hodgman算法n多边形与窗口裁剪线的裁剪多边形与窗口裁剪线的裁剪u依据多边形的边依据多边形的边SP与半空间的关系与半空间的关系l情况情况1:同在内侧,裁剪后输出:同在内侧,裁剪后输出Pl情况情况2

14、:S 在内侧,在内侧,P 在外侧,裁剪后输出交点在外侧,裁剪后输出交点 il情况情况3:同在外侧,裁剪后不输出:同在外侧,裁剪后不输出l情况情况4:S 在外侧,在外侧, P 在内侧,裁剪后输出交点在内侧,裁剪后输出交点 i 和和 P477.6.1 Sutherland-Hodgman算法l算法算法n将顶点序列将顶点序列P1P2Pn作为输入作为输入n依次对窗口的每条裁剪线作下列处理依次对窗口的每条裁剪线作下列处理u输入顶点序列输入顶点序列u依次顶点序列中相邻顶点构成的边依次顶点序列中相邻顶点构成的边PiPi+1进行裁剪处理进行裁剪处理u输出顶点序列(下条裁剪线的输入)输出顶点序列(下条裁剪线的输

15、入)48l例子例子7.6.1 Sutherland-Hodgman算法上:输入上:输入 I1P2P3P4P5P6P7P8I2 输出输出 P2I3I4P4P5P6P7P8I2I1下:输入下:输入 I3I4P4I5I6P6P7P8I2I1P2 输出输出 I4P4I5I6I7I8P8I2I1P2I3左:输入左:输入 P1P2P3P4P5P6P7P8 输出输出 I1P2P3P4P5P6P7P8I2右:输入右:输入 P2I3I4P4P5P6P7P8I2I1 输出输出 I3I4P4I5I6P6P7P8I2I1P2注意:注意:(1)交点是边与裁剪线的交点)交点是边与裁剪线的交点(2)边的顶点是有序的)边的顶

16、点是有序的49l特点特点n裁剪算法采用流水线方式,算法简单裁剪算法采用流水线方式,算法简单n推广到任意凸多边形裁剪窗口推广到任意凸多边形裁剪窗口 原因是:凸多边形的边能将平面空间分成原因是:凸多边形的边能将平面空间分成2部分,其中部分,其中一部分含裁剪窗口一部分含裁剪窗口7.6.1 Sutherland-Hodgman算法507.6.2 Weiler-Athenton算法*l裁剪窗口为任意多边形(凸、凹、带内环)的情况裁剪窗口为任意多边形(凸、凹、带内环)的情况n主多边形:被裁剪多边形,记为主多边形:被裁剪多边形,记为A n裁剪多边形:裁剪窗口,记为裁剪多边形:裁剪窗口,记为B517.6.2

17、Weiler-Athenton算法*l主多边形主多边形A被裁剪多边形被裁剪多边形B裁剪后裁剪后n内裁剪:内裁剪:ABn外裁剪:外裁剪:ABl内裁剪的特点内裁剪的特点n裁剪结果区域的边界由裁剪结果区域的边界由A的部分边的部分边 界和界和B的部分边界两部分构成,的部分边界两部分构成, 并且在交点处边界发生交替,即由并且在交点处边界发生交替,即由A 的边界转至的边界转至B的边界,或由的边界,或由B的边界的边界 转至转至A的边界的边界52l交点交点n交点成对出现:既在交点成对出现:既在A中也在中也在B中中n两类:两类:(1)进点进点:主多边形边界由此进入裁剪多边形内:主多边形边界由此进入裁剪多边形内

18、如,如,I1, I3, I5, I7, I9, I11(2)出点出点:主多边形边界由:主多边形边界由此离开裁剪多边形区域此离开裁剪多边形区域 如,如, I0, I2, I4, I6, I8, I107.6.2 Weiler-Athenton算法*BAA是主多边形是主多边形53l内裁剪算法步骤内裁剪算法步骤 1 1、建立主多边形和裁剪多边形的顶点表、建立主多边形和裁剪多边形的顶点表 2 2、求主多边形和裁剪多边形的交点,并、求主多边形和裁剪多边形的交点,并将这些交点按顺序插入两多边形的顶点表将这些交点按顺序插入两多边形的顶点表中。在两多边表形顶点表中的相同交点间中。在两多边表形顶点表中的相同交点

19、间建立双向指针建立双向指针7.6.2 Weiler-Athenton算法*543、裁剪、裁剪 如果存在没有被跟踪过的交点,执行以下步骤如果存在没有被跟踪过的交点,执行以下步骤 (1)(1)建立裁剪结果多边形的顶点表建立裁剪结果多边形的顶点表 (2)(2)选取任一没有被跟踪过的交点为始点,将选取任一没有被跟踪过的交点为始点,将其输出到结果多边形顶点表中其输出到结果多边形顶点表中 (3)(3)如果该交点为进点,跟踪主多边形边边界;如果该交点为进点,跟踪主多边形边边界;否则跟踪裁剪多边形边界否则跟踪裁剪多边形边界 (4) (4) 跟踪多边形边界,每遇到多边形顶点,将跟踪多边形边界,每遇到多边形顶点,

20、将其输出到结果多边形顶点表中,直至遇到新的交其输出到结果多边形顶点表中,直至遇到新的交点点 (5)(5)将该交点输出到结果多边形顶点表中,并将该交点输出到结果多边形顶点表中,并通过连接该交点的双向指针改变跟踪方向(如果通过连接该交点的双向指针改变跟踪方向(如果上一步跟踪的是主多边形边界,现在改为跟踪裁上一步跟踪的是主多边形边界,现在改为跟踪裁剪多边形边界;如果上一步跟踪裁剪多边形边界,剪多边形边界;如果上一步跟踪裁剪多边形边界,现在改为跟踪主多边形边界)现在改为跟踪主多边形边界) (6)(6)重复重复(4)(4)、(5)(5)直至回到起点直至回到起点7.6.2 Weiler-Athenton算

21、法*557.6.2 Weiler-Athenton算法*进点进点:I1, I3, I5, I7, I9, I11出点出点:I0, I2, I4, I6, I8, I1056l交点的奇异情况处理交点的奇异情况处理 1、与裁剪多边形边重合的主多边形的边不参与求交点、与裁剪多边形边重合的主多边形的边不参与求交点2、对于顶点落在裁剪多边形的边上的主多边的边,如果落在该裁剪边、对于顶点落在裁剪多边形的边上的主多边的边,如果落在该裁剪边的内侧,将该顶点算作交点;而如果这条边落在该裁剪边的外侧,的内侧,将该顶点算作交点;而如果这条边落在该裁剪边的外侧,将该顶点不看作交点将该顶点不看作交点7.6.2 Weiler-Athenton算法*57l基于字符串基于字符串n整个字符串完全落在整个字符串完全落在 窗口之内时显示,否则窗口之内时显示,否则不显示不显示n字符串的矩形包围盒字符串的矩形包围盒测试测试l基于字符基于字符n一个字符完全落在一个字符完全落在 窗口之内时显示,否则窗口之内时显示,否则不显示不显示n字符的矩形包围盒字符的矩形包围盒测试测试7.7 字符裁剪58

温馨提示

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

评论

0/150

提交评论