ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:254.36KB ,
资源ID:23646718      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23646718.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(梁友栋Barsky直线裁剪算法计算机图形学教学规划.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

梁友栋Barsky直线裁剪算法计算机图形学教学规划.docx

1、梁友栋Barsky直线裁剪算法计算机图形学教学规划河南理工大学万方科技学院课程设计报告2011 2012学年第二学期课程名称 计算机图形学 设计题目 计算机图形学基本算法 演示系统设计 学生姓名 学 号 专业班级 网络11升1班 指导教师 徐 文 鹏 2012 年 5 月 28 日第5章 总结 17第1章 设计内容与要求1.1 总体目标和要求目标:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面作出评价和改进意见。通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到:1) 巩固和实践计算机图形学课程中的

2、理论和算法;2) 学习表现计算机图形学算法的技巧;3) 培养认真学习、积极探索的精神。总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。开发环境:Viusal C+ 6.0,VC2005或其他你认为比较熟悉的环境。1.2 内容与要求实验分为五项内容。1.2.1 直线的生成内容:用Bresenham算法画直线要求:1) 鼠标移动时,显示鼠标当前位置2) 显示判别式的计算过程和下一点的选择策略3) 记录生成点的坐标4) 图形生成过程可以重复进行1.2.2 圆弧的生成内容:用Bresenham算法画圆要求:1) 鼠标移动时,显示鼠标当

3、前位置2) 显示判别式的计算过程和下一点的选择策略3) 记录生成点的坐标4) 图形生成过程可以重复进行5) 橡皮筋技术实现1.2.3 线段裁剪内容:用梁友栋-Barsky算法进行线段裁剪要求:1) 对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来2) 用橡皮筋的形式输入剪裁线段1.2.4 多边形裁剪内容:用Sutherland-Hodgman算法进行多边形裁剪要求:1) 裁剪过程需先输入一多边形,然后用窗口四边裁剪的过程中要显示顶点增删过程。2) 用橡皮筋的形式输入剪裁线段1.2.5 综合内容:把前四次的实验内容整合到一起要求:第2章 总体设计2.1 Bresenham算法画直线2.1.1

4、 Bresenham算法画直线理论基础计算机是如何画直线的?简单来说,就是过各行各列像素中心构造一组虚拟的网格线,按直线从起点到终点的顺序计算各直线与歌垂直网格线的交点,然后确定各列像素中与此交点最近的像素。真实的直线是连续的,但我们的计算机显示的精度有限,不可能真正显示连续的直线,于是我们用一系列离散化后的点(像素)来近似表现这条直线。2.1.2 Bresenham算法画直线原理接下来的问题就是如何尽可能高效地找到这些离散的点,Bresenham直线算法就是一个非常不错的算法。Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只

5、会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。这个算法的流程图如下:可以看到,算法其实只考虑了斜率在 0 1 之间的直线,也就是与 x 轴夹角在 0 度到 45 度的直线。只要解决了这类直线的画法,其它角度的直线的绘制全部可以通过简单的坐标变换来实现。 2.2 Bresenham算法画圆2.2.1 Bresenham算法画圆理论基础Bresenham画圆算法与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。为了简便起见,考虑一个圆心在坐标原点的

6、圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。为什么只计算八分圆周上的点就可以了呢?和上面的直线算法类似,圆也有一个“八对称性”,如下图所示。 显然,我们只需要知道了圆上的一个点的坐标 (x, y) ,利用八对称性,我们马上就能得到另外七个对称点的坐标。 2.2.2 Bresenham算法画圆原理和直线算法类似,Bresenham画圆算法也是用一系列离散的点来近似描述一个圆,如下图。 Bresenham画圆算法的流程图如下。 可以看到,与画线算法相比,画圆的循环中用到了整数的乘法,相对复杂了一些。 2.3 梁友栋-Barsky算法进行线段裁剪2.3.1梁友栋-Barsky算法

7、进行线段裁剪基本原理我们知道,一条两端点为P1(x1,y1)、P2(x2,y2)的线段可以用参数方程形式表示:x= x1+ u(x2-x1)= x1+ ux,y= y1+ u(y2-y1)= y1+ uy式中,x=x2-x1,y=y2-y1,参数u在01之间取值,P(x,y)代表了该线段上的一个点,其值由参数u确定,由公式可知,当u=0时,该点为P1(x1,y1),当u=1时,该点为P2(x2,y2)。如果点P(x,y)位于由坐标(xwmin,ywmin)和(xwmax,ywmax)所确定的窗口内,那么下式成立:xwminx1+ uxxwmax,ywminy1+ uyywmax这四个不等式可以

8、表示为:upk qk , k=1,2,3,4其中,p、q定义为p1=-x, q1=x1-xwminp2= x, q2=xwmax-x1p3=-y, q3=y1-ywminp4= y, q4=ywmax-y1可以知道:任何平行于窗口某边界的直线,其pk=0,k值对应于相应的边界(k=1,2,3,4对应于左、右、下、上边界)。如果还满足qk0,则线段完全在边界外,应舍弃该线段。如果pk=0并且qk0,则线段平行于窗口某边界并在窗口内,见图中所示。1、当pk0时,线段从裁剪边界延长线的内部延伸到外部;例如,当x0时,对于左边界p10(p2=x),线段从右边界的内部到外部。当y0(p3=-y),线段从

9、下边界的内部到外部;对于上边界p40(p4=y),线段从上边界的外部到内部。当pK0时,可以计算出参数u的值,它对应于无限延伸的直线与延伸的窗口边界k的交点,即:对于每条直线,可以计算出参数u1和u2,该值定义了位于窗口内的线段部分:1、u1的值由线段从外到内遇到的矩形边界所决定(pk0),对这些边界计算rk=qk/pk,u2取0和各个r值之中的最小值。3、如果u1u2,则线段完全落在裁剪窗口之外,应当被舍弃;否则,被裁剪线段的端点可以由u1和u2计算出来。2.4 Sutherland-Hodgman算法进行多边形裁剪2.4.1 SutherlandHodgman多边形裁剪算法思想该算法的基本

10、思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。当多边形一个顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则):1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列;2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列;3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点

11、序列;4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。2.4.2 点在边界内侧的判断方法为了判断点是否在边界内侧可用坐标比较法和更通用的向量叉积符号判别法。1、坐标比较法将点的某个方向分量与边界进行比较。例如,判断某点是否在下边界内侧,用条件判别式: if(pi1=ymin) 即可。2、向量叉积法为简单计,测试点表示为P点。假设窗口边界方向为顺时针,如图中所示,对于其中任一边界向量,从向量起点A向终点B看过去:如果被测试点P在该边界线右边(即内侧),ABAP的方向与X-Y平面垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。反过来,如果P在该边界线的左边(即外侧),这时ABA

12、P的方向与X-Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。设:点P(x,y)、点A(xA,yA)、点B(xB,yB),向量AB=(xB-xA),(yB-yA),向量AP=(x-xA),(y-yA),那么ABAP的方向可由下式的符号来确定:V=(xB-xA)*(y-yA)- (x-xA)*(yB-yA) 因此,当V0时,P在边界线内侧;而V0时,P在边界线外侧。2.4.4 Sutherland-Hodgeman多边形裁剪算法特点SutherlandHodgeman多边形裁剪算法具有一般性,被裁剪多边形可以是任意凸多边形或凹多边形,裁剪窗口不局限于矩形,可以是任意凸多边形。上面的算法是多

13、边形相对窗口的一条边界进行裁剪的实现,对于窗口的每一条边界依次调用该算法程序,并将前一次裁剪的结果多边形作为下一次裁剪时的被裁剪多边形,即可得到完整的多边形裁剪程序。第3章 详细设计3.1 Bresenham算法画直线3.1.1 Bresenham 算法画线算法具体实现过程1、画点(x1, y2); dx=x2-x1; dy=y2-y1;计算误差初值P1=2dy-dx; i=1;2、求直线的下一点位置:xi+1=xi+1;if Pi0 则yi+1=yi+1;否则yi+1=yi;3、画点(xi+1, yi-1);4、求下一个误差Pi+1;if Pi0 则Pi+1=Pi+2dy-2dx;否则Pi+

14、1=Pi+2dy;5、i=i+1; if i|dy|为分支,并分别将2a, 3a象限的直线和3b, 4b象限的直线变换到1a, 4a和2b, 1b方向去,以求得程序处理的简洁。3.2 Bresenham算法画圆3.2.1 Bresenham 算法画圆核心代码根据Bresenham算法思想编写程序代码,在Bresenham算法画线的基础上画圆,程序代码如下:void BresenhamCircle(int x0,int y0,int R)/,int color) int x,y,d; x=0;y=R; d=3-2*R; while(xy) glColor3f (0.0f, 1.0f, 0.0f)

15、; putpixel(x0+x,y0+y); putpixel(x0+x,y0-y); putpixel(x0-x,y0+y); putpixel(x0-x,y0-y); putpixel(x0+y,y0+x); putpixel(x0+y,y0-x); putpixel(x0-y,y0+x); putpixel(x0-y,y0-x); if(d0) d=d+4*x+6; elsed=d+4*(x-y)+10;y=y-1; x+; 3.3 梁友栋-Barsky算法进行线段裁剪3.3.1梁友栋-Barsky算法推导过程情形一 pk=0p1p20若q10或q2=0且q2=0,则进一步判断 u=qk

16、/pk(k=3,4) 令u1=max(0,u|pk0)若u1u2,则可删除直线段若u1=u2,将u1,u2代入直线方程,得到直线段的两个可见端点。p3p40 若q30或q4=0且q4=0,则进一步判断 u=qk/pk(k=1,2)令u1=max(0,u|pk0)若u1u2,则可删除直线段若u1=u2,将u1,u2代入直线方程,得到直线段的两个可见端点。情形二 pk不为0u=qk/pk(k=1,2,3,4)令 u1=max(0,u|pk0,u|pk0, u|pk0)若u1u2,则可删除直线段若u1=u2,将u1,u2代入直线方程,得到直线段的两个可见端点。3.3.2梁友栋-Barsky算法进行线

17、段裁剪的步骤(1) 输入直线段的两端点坐标以及窗口的四条边界坐标。(2) 若x=0,则p1=p2=0。进一步判断是否满足q10或q20且q20,则进一步计算u1和u2。转(5)。 (3) 若y=0,则p3=p4=0。进一步判断是否满足q30或q40且q20,则进一步计算u1和u2。转(5)。(4) 若上述两条均不满足,则有pk0(k=1,2,3,4)。此时计算u1和u2。(5) 求得u1和u2后,进行判断:若u1u2,则直线段在窗口外,转(7)。若u1u2,利用直线的参数方程求得直线段在窗口内的两端点坐标。(6) 利用直线的扫描转换算法绘制在窗口内的直线段。(7) 算法结束。3.4 Suthe

18、rland-Hodgman算法进行多边形裁剪3.4.1 SutherlandHodgman多边形裁剪算法步骤考虑多边形相对于一条边界及其延长线进行裁剪的算法:1 从主函数得到待裁剪多边形的顶点序列P2、顶点序列数n、窗口一条边界参数xl(假如为矩形窗口的左边界);2 赋初值:将顶点序列中的最后一个顶点赋给前一顶点S;设置初始标志flag:if(S在边界内侧)flag=0;else flag=1;设新的顶点序列数j=0;3 对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列Q2中: for(对第一个顶点直到最后一个顶点,逐一处理)if(Pi在边界内侧) if(flag!=0) flag=

19、0;求交点并放入新的多边形顶点序列Qj中; j+; 将当前顶点放入新的多边形顶点序列Qj中:Qj=Pi; j+; Elseif(flag=0) flag=1;求交点并放入新的多边形顶点序列Qj中; j+; 将当前顶点赋给S:S=Pi; 4 做返回准备:5 将新的多边形顶点序列Q又逐一放回原多边形顶点序列P中:P=Q;6 将新的多边形顶点数j放回原多边形顶点数n中:n=j;3.5将画线、画圆、线段裁剪和多边形裁剪综合在显示函数中将各个算法添加到一个程序中,使用右键菜单的特殊功能实现画线、画圆、线段裁剪和多边形裁剪,主要是processMenuEvents函数和createGLUTMenus函数的

20、编写。这两个函数的程序代码如下:void processMenuEvents(int option) switch (option) case 1:select = 1; glutPostRedisplay(); break; case 2: select = 2; glutPostRedisplay(); break; case 3:select = 3; glutPostRedisplay(); break; case 4:select =4; glutPostRedisplay(); break; default: break;void createGLUTMenus() int men

21、u; menu = glutCreateMenu(processMenuEvents); glutAddMenuEntry(Bresenham Line,1); glutAddMenuEntry(Bresenham Circle,2); glutAddMenuEntry(Liang-Barsky Cut,3); glutAddMenuEntry(Sutherland-Hodgman Cut,4); glutAttachMenu(GLUT_RIGHT_BUTTON); void Display() glClear(GL_COLOR_BUFFER_BIT); Wangge(); glColor3f

22、 (0.0f, 0.0f, 0.0f); glRectf(rect.xmin,rect.ymin,rect.xmax,rect.ymax); if(select = 1) myDisplay_Line(); else if(select=2) myDisplay_Circle(); else if(select=3) myDisplay_cut(); else if(select=4) myDisplay_cutGraphics(); glutSwapBuffers(); glFlush();第4章 功能实现4.1用Bresenham算法画线测试结果打开vc+6.0,加载画线代码并运行,点击画

23、线并输入数据:然后点击Bresenham算法,就得到结果:4.2用Bresenham算法画圆测试结果打开vc+6.0,加载画圆代码并运行,然后测试结果如下:4.3梁友栋-Barsky算法进行线段裁剪测试结果打开vc+6.0,加载画圆代码并运行,先点击画线:然后点击裁剪得到如下结果:4.4 Sutherland-Hodgman算法进行多边形裁剪测试结果Sutherland-Hodgman算法中来实现多边形的裁剪,不同图形裁剪的结果如图所示。4.5将四种算法综合测试结果运行该程序后,出现主界面,然后单击鼠标右键,出现4个菜单项,分别是Bresenham Line、Bresenham Circle、

24、Liang-Barsky Cut、Sutherland-Hodgman Cut。单击Bresenham Line项可以画线,单击Bresenham Circle项可以画圆,单击Liang-Barsky Cut项可以进行线段裁剪,单击Sutherland-Hodgman Cut项可以进行多边形裁剪。第5章 总结通过本次课程设计,使我进一步深入了解了计算机图形学和对vc的使用,也提高了我对程序的理解和调试能力。程序的编写也经历了问题的提出及分析,简化,再简化,最终编程实现的过程。该设计过程中遇到了很多的问题,有些问题任然还没有解决,程序也存在着很大不足,但通过自己动手,真正提高了我的动手能力。同时也得到了同学的帮助使我学到了很多东西。参考文献【1】唐荣锡,等。计算机图形学教程(修订版)【M】北京:科学出版社,2000.【2】唐泽圣,等。计算机图形学基础【M】北京:清华大学出版社,1995.【3】徐文鹏。计算机图形学【M】机械工业出版社,2010.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1