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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

计算机图形学实验四 裁剪.docx

1、计算机图形学实验四 裁剪贵州大学实验报告学院:计算机科学与技术 专业: 计算机科学与技术 班级:计科131姓名学号实验组实验时间指导教师黄初华成绩实验项目名称直线裁剪实验目的一、实验目的掌握常用的裁减及消隐算法:直线的裁剪实验要求实现一个直线裁减算法 对于设计性实验,应根据“由学生自行设计实验方案并加以实现的实验”内涵要求,注意省略由学生自主设计的“实验方案”. 根据本实验的特点、要求和具体条件,采用“以学生自主训练为主的开放模式组织教学,还是采用集中授课形式”,须加以明确。实验原理直线裁减Cohen-SutherLand算法(编码算法)算法原理(递归的裁剪过程):对于每条线段P1P2分为三种

2、情况处理:(1)若P1P2完全在窗口内,则显示该线段P1P2。(2)若P1P2明显在窗口外,则丢弃该线段。(3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。为快速判断,采用如下编码方法:由窗口四条边所在直线把二维平面分成9个区域(右图),每个区域赋予一个四位编码:CtCbCrCl(上下右左);直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界的位置。各位编码含义:上:if yymax,Ct=1,else, 0;下:if yxmax,Cr=1,else, 0;左:if xxmax,Cl=1,else,

3、 0;对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右; 如果两端点的编码均为0000,表示直线在窗口内。 如果两端点的编码相与不为0000,表示直线在窗口外。 如果两端点的编码不全为0000,但相与为0000,则该直线部分可见,需计算直线与窗口的交点,确定哪一部分可见。 算法描述:BOOL done,draw;(done表示是否完成,draw表示是否可见)Unsigned char code1,code2;端点1,端点2的编码While (!done)begin if (判断code1,code2,若为第1种情况)begin done = TRUE; draw

4、 = TRUE;end else if (为第2种情况)begin done = TRUE; draw = FALSE;end else if(检查code1,若在窗口内)/*第3种情况*/begin交换端点及端点的编码;以左,上,右,下的次序对端点1进行判断及求交;将交点的值赋给端点1;endend算法分析:本算法的优点在于简单,易于实现。用编码方法可快速判断线段的完全可见和显然不可见,他可以简单的描述为将直线在窗口左边的部分删去,按左,右,下,上的顺序依次进行,处理之后,剩余部分就是可见的了。在这个算法中求交点是很重要的,他决定了算法的速度。本算法对于其他形状的窗口是否同样有效就值得讨论了

5、,这也证明了在图形算法中,没有几个是对大多数情况有效的。特别适用二种情形:大窗口场合;窗口特别小场合(光标拾取图形,光标看作小的裁剪窗口)。Cohen-Sutherland与中点法在区域码测试阶段能以位运算方式高效率地进行,因而当大多数线段能够简单的取舍时,效率较好。实验环境五、实验条件: 硬件平台:PC 软件(推荐):Windows平台,Visualstdio2013,opengl实验步骤六、实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;3. 对运行结果进行保存与分析;4. 把源程序以文件的形式提交;5. 按格式书写实验报告。实验内容#includestdafx.h#in

6、clude #include #include #pragma comment( lib, opengl32.lib ) #pragma comment( lib, glu32.lib ) #pragma comment( lib, glut32.lib ) #define LEFT_EDGE 1#define RIGHT_EDGE 2#define BOTTOM_EDGE 4#define TOP_EDGE 8static int times = 1;/画从(x0,y0)到(x1,y1)的直线void LineGL(int x0, int y0, int x1, int y1) glBegi

7、n(GL_LINES); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(x0, y0); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(x1, y1); glEnd();/矩形的结构体typedef struct Rectangle float xmin; float xmax; float ymin; float ymax; Rectan;Rectan rect;int x0, y0, x1, y1;/求出坐标点的Cohen-Sutherland编码int CompCode(int x, int y, Rectan rect

8、) int code = 0x00; if (y rect.ymax) code = code | 8; if (xrect.xmax) code = code | 2; if (xrect.xmin) code = code | 1; return code;/裁剪直线int cohensutherlandlineclip(Rectan rect, int& x0, int& y0, int& x1, int& y1) int accept = 0, done = 0; float x, y; int code0, code1, codeout; int x00 = x0, y00 = y0

9、, x11 = x1, y11 = y1; code0 = CompCode(x0, y0, rect); code1 = CompCode(x1, y1, rect); /直线全部在矩形框内部,应保留 if (!(code0 | code1) accept = 1; done = 1; /直线和矩形不相交,并且划直线的两点在矩形同侧(上、下、右。左),应去掉。 if (code0 & code1) done = 1; while (!done) /直线和矩形有交点,只保留矩形内部的 if (!(code0 | code1) accept = 1; done = 1; else if (cod

10、e0 != 0) codeout = code0; else codeout = code1; if (codeout & LEFT_EDGE) y = y0 + (y1 - y0)*(rect.xmin - x0) / (x1 - x0); x = (float)rect.xmin; else if (codeout &RIGHT_EDGE) y = y0 + (y1 - y0)*(rect.xmax - x0) / (x1 - x0); x = (float)rect.xmax; else if (codeout & BOTTOM_EDGE) x = y0 + (x1 - x0)*(rec

11、t.ymin - y0) / (y1 - y0); y = (float)rect.ymin; else if (codeout & TOP_EDGE) x = x0 + (x1 - x0)*(rect.ymax - y0) / (y1 - y0); y = (float)rect.ymax; if (codeout = code0) x0 = x; y0 = y; code0 = CompCode(x0, y0, rect); else x1 = x; y1 = y; code1 = CompCode(x1, y1, rect); /直线和矩形不相交,但是划直线的两点在矩形不同侧,这时应去掉

12、。 if (times = 3) & (code0 & code1) x0 = x1; y0 = y1; done = 1; accept = 1; if (accept) LineGL(x0, y0, x1, y1); return accept;void myDisplay() glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 1.0f, 0.0f); glRectf(rect.xmin, rect.ymin, rect.xmax, rect.ymax); LineGL(x0, y0, x1, y1); glFlush();void Init()

13、glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); rect.xmin = 100; rect.xmax = 300; rect.ymin = 100; rect.ymax = 300; x0 = 0; y0 = 360; x1 = 650; y1 = 0;void Reshape(int w, int h) glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdoubl

14、e)w, 0.0, (GLdouble)h);/按键盘上字母c裁剪,字母r恢复原状,字母x退出。void keyboard(unsigned char key, int x, int y) switch (key) case c: cohensutherlandlineclip(rect, x0, y0, x1, y1); glutPostRedisplay(); break; case r: Init(); glutPostRedisplay(); break; case x: exit(0); break; default: break; int main(int argc, char*

15、argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(640, 480); glutCreateWindow(裁剪); Init(); glutDisplayFunc(myDisplay); glutReshapeFunc(Reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0;实验结果实验总结 通过这次实验我对于直线的裁剪有了一定的认识,我实现的直线裁剪方法是Cohen-SutherLand算法(编码算法)算法原理:对于每条线段P1P2分为三种情况处理:若P1P2完全在窗口内,则显示该线段P1P2。若P1P2明显在窗口外,则丢弃该线段。若线段不满足(1)或(2)的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。指导教师意见签名: 年 月 日

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

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