首页 计算机图形学图形裁剪

计算机图形学图形裁剪

举报
开通vip

计算机图形学图形裁剪计算机图形学图形裁剪 宁夏师范学院数学与计算机科学学院 《计算机图形学》实验报告 实验序号: 8 实验项目名称:图形裁剪 学 号 姓 名 专业、班 实验地点 指导教师 时 间 一、实验目的: 1.理解区域码(region Code,RC); 2.设计Cohen-Sutherland直线裁剪算法和梁友栋-Barsky线段裁剪算法 3.编程实现Cohen-Sutherland直线裁剪算法和梁友栋-Barsky线段裁剪算法 二、实验内容与步骤 1. Cohen-Sutherland算法分析: Coh...

计算机图形学图形裁剪
计算机图形学图形裁剪 宁夏师范学院数学与计算机科学学院 《计算机图形学》实验 报告 软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载 实验序号: 8 实验项目名称:图形裁剪 学 号 姓 名 专业、班 实验地点 指导教师 时 间 一、实验目的: 1.理解区域码(region Code,RC); 2.设计Cohen-Sutherland直线裁剪算法和梁友栋-Barsky线段裁剪算法 3.编程实现Cohen-Sutherland直线裁剪算法和梁友栋-Barsky线段裁剪算法 二、实验内容与步骤 1. Cohen-Sutherland算法分析: Cohen-Sutherland线段裁剪算法也称之为编码算法,第一步判断线段两端是否都位于窗口内,如果是,则线段完全可见;否则进入第二步,判断线段是否为显然不可见,即线段的两端点均落在窗口某边所在直线的外侧,如果是,则裁减结束;否则进入第三步,求线段与窗口边延长线的交点,这个交点将线段分为两段,其中一段显然不可见,丢弃。对余下的另一段重新进行第一步,第二步判断,直至结束。整个裁减的过程可以看作一个丢弃的过程。 S S i 外侧 P 内P 内侧 侧 情况1 情况2 S S i 内侧 P P 外侧 情况3 情况4 2.梁友栋-Barsky算法分析: (1)初始化线段交点的参数:u=0,u=1; 12 (2)计算出各个裁剪边界的p、q值; (3)调用函数clipTest(),在函数中根据p、q来判断:是舍弃线段还是改变交点的参数。 ? 当p<0时,参数r用于更新u; 1 (u=max{u,…,r}) 11k ? 当p>0时,参数r用于更新u。 2 (u=min{u,…,r}) 22k ?如果更新了u或u后,使u>u,则舍弃该线段。 1212 ?当p=0且q<0时,因为线段平行于边界并且位于边界之外,则舍弃该 线段。见下图所示。 (4)p、q的四个值经判断后,如果该线段未被舍弃,则裁剪线段的端点坐标 由参数u和u的值决定。 12 三、程序代码: 1.Cohen-Sutherland程序代码: #include #include class wcPt2D{ public: GLfloat x,y;}; inline GLint round(const GLfloat a){ return GLint(a+0.5);} const GLint winLeftBitCode = 0x1; const GLint winRightBitCode = 0x2; const GLint winBottomBitCode = 0x4; const GLint winTopBitCode = 0x8; void init(void){ glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,640.0,0.0,480.0); glMatrixMode(GL_MODELVIEW);} void setPixel(GLint xCoord,GLint yCoord){ glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd();} void lineBres (int x0,int y0,int xend,int yend){ int dx = fabs(xend - x0),dy = fabs(yend - y0); int p = 2 * dy - dx; int twoDy = 2 * dy, twoDyMinusDx = 2 * (dy - dx); int x,y; if(x0 > xend){ x = xend; y = yend; xend = x0;} else{ x = x0; y = y0;} setPixel(x,y); while(x < xend){ x++; if(p < 0) p += twoDy; else{ y++; p += twoDyMinusDx;} setPixel(x,y);}} inline GLint inside(GLint code){ return GLint(!code);} inline GLint reject(GLint code1,GLint code2){ return GLint(code1&code2);} inline GLint accept(GLint code1,GLint code2){ return GLint(!(code1|code2));} GLubyte encode(wcPt2D pt,wcPt2D winMin,wcPt2D winMax){ GLubyte code = 0x00; if(pt.xwinMax.x) code = code|winRightBitCode; if(pt.ywinMax.y) code = code|winTopBitCode; return (code);} void swa ppt 关于艾滋病ppt课件精益管理ppt下载地图下载ppt可编辑假如ppt教学课件下载triz基础知识ppt s(wcPt2D *p1,wcPt2D*p2){ wcPt2D tmp; tmp = *p1; *p1 = *p2; *p2 = tmp;} void swapCodes(GLubyte *c1,GLubyte *c2){ GLubyte tmp; tmp = *c1; *c1 = *c2; *c2 = tmp;} void lineClipCohSuth(wcPt2D winMin,wcPt2D winMax,wcPt2D p1,wcPt2D p2){ GLubyte code1,code2; GLint done = false,plotLine = false; GLfloat m; while(!done){ code1 = encode(p1,winMin,winMax); code2 = encode(p2,winMin,winMax); if(accept(code1,code2)){ done = true; plotLine = true;} else if(reject(code1,code2)) done = true; else{ if(inside(code1)){ swapPts(&p1,&p2); swapCodes(&code1,&code2);} if(p2.x!=p1.x) m=(p2.y - p1.y)/(p2.x-p1.x); if(code1&winLeftBitCode){ p1.y+=(winMin.x-p1.x)*m; p1.x = winMin.x;} else if(code1&winRightBitCode){ p1.y+=(winMax.x-p1.x)*m; p1.x = winMax.x;} else if(code1&winBottomBitCode){ if(p2.x!=p1.x) p1.x+=(winMin.y - p1.y)/m; p1.y = winMin.y;} else if(code1&winTopBitCode){ if(p2.x!=p1.x) p1.x+=(winMax.y - p1.y)/m; p1.y = winMax.y;} } } if(plotLine) lineBres(round(p1.x),round(p1.y),round(p2.x),round(p2.y));//直线生成算法 } void display(void){ int flag = 1; wcPt2D winMin,winMax,p1,p2; winMin.x = 100;//定义裁剪窗口 winMin.y = 200; winMax.x = 400; winMax.y = 400; p1.x = 50;//定义被裁剪的直线端点 p1.y = 50; p2.x = 450; p2.y = 450; glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,1.0); glRectf(winMin.x,winMin.y,winMax.x,winMax.y);//绘制蓝色裁剪矩形 glColor3f(1.0,1.0,1.0); if (flag){lineClipCohSuth (winMin, winMax,p1,p2);// 绘制裁剪线段} else{ glBegin(GL_LINES); glVertex2i(p1.x,p1.y); glVertex2i(p2.x,p2.y); glEnd();} glFlush(); } void Reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);} void keyboard(unsigned char key, int x, int y){ int flag; if (key=='c' || key=='C') flag=1; if (key=='r' || key=='R') flag=0; glutPostRedisplay();} void main(int argc,char **argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(640,480); glutCreateWindow("chaungkou"); init(); glutDisplayFunc(display); glutReshapeFunc(Reshape); glutKeyboardFunc(keyboard); glutMainLoop();} 2.梁友栋-Barsky程序代码: #include #include #include class wcPt2D{ public: GLfloat x,y; setCoords(GLfloat xCoord,GLfloat yCoord){ x = xCoord; y = yCoord;} GLfloat getx() const{ return x;} GLfloat gety() const{ return y;} }; void init(void){ glClearColor(1.0,1.0,1.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 640.0, 0.0, 480.0);} void Reshape(int w, int h){ glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);} inline GLint round(const GLfloat a){return GLint(a+0.5);} GLint clipTest(GLfloat p,GLfloat q,GLfloat *u1,GLfloat *u2){ GLfloat r; GLint returnValue = true; if(p<0.0){ r = q/p; if(r>*u2) returnValue = false; else if(r>*u1) *u1 = r;} else if(p>0.0){ r = q/p; if(r<*u1) returnValue = false; else if(r<*u2) *u2 = r;} else if(q<0.0) returnValue = false; return(returnValue); } void setPixel(GLint xCoord,GLint yCoord){ glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd();} void lineBres(int x0,int y0,int xEnd,int yEnd){ int dx = fabs(xEnd - x0),dy = fabs(yEnd - y0); int p = 2*dy - dx; int twoDy = 2*dy,twoDyMinusDx = 2*(dy - dx); int x,y; if(x0>xEnd){ x = xEnd; y = yEnd; xEnd = x0;} else{ x = x0; y = y0;} setPixel(x,y); while(x0.0){ p1.setCoords(p1.getx()+u1*dx,p1.gety()+u1*dy);} glColor3f(0.0,0.0,0.0); lineBres(round(p1.getx()),round(p1.gety()),round(p2.getx()),round(p2.gety()));}}} void display(){ GLint flag = 1; wcPt2D winMin , winMax , p1 , p2; winMin.x=100; winMin.y=200;//定义裁剪窗口 winMax.x=400; winMax.y=400; p1.x=50; p1.y=50; //定义被裁剪的直线端点 p2.x=450; p2.y=450; glClear(GL_COLOR_BUFFER_BIT); glColor3f (0.3, 0.8, 0.7); glRectf(winMin.x ,winMin.y ,winMax.x,winMax.y); //绘制裁剪矩形 glColor3f (1.0, 1.0, 1.0); if (flag){ lineClipLiangBarsk (winMin, winMax,p1,p2);// 绘制裁剪线段 } else{ glBegin(GL_LINES); glVertex2i(p1.x,p1.y); glVertex2i(p2.x,p2.y); glEnd();} glFlush();} void main(int argc,char **argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(50,50); glutInitWindowSize(600,600); glutCreateWindow("Demo"); init(); glutDisplayFunc(display); glutReshapeFunc(Reshape); glutMainLoop();} 四、程序运行结果 Cohen,Sutherland算法结果: 梁友栋-Barsky算法结果: 六、教师评语 成绩 签名: 日期: 年 月 日
本文档为【计算机图形学图形裁剪】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_998870
暂无简介~
格式:doc
大小:46KB
软件:Word
页数:14
分类:互联网
上传时间:2017-12-28
浏览量:145