实验4-编码裁剪算法.docxVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验4-编码裁剪算法

实验4 编码裁剪算法实验目的了解二维图形裁剪的原理(点的裁剪、直线的裁剪、多边形的裁剪),利用VC+OpenGL实现直线的裁剪算法。2.实验内容(1) 理解直线裁剪的原理(Cohen-Surtherland算法、梁友栋算法)(2) 利用VC+OpenGL实现直线的编码裁剪算法,在屏幕上用一个封闭矩形裁剪任意一条直线。(3) 调试、编译、修改程序。(4) 尝试实现梁友栋裁剪算法。实验原理编码裁剪算法中,为了快速判断一条直线段与矩形窗口的位置关系,采用了如图所示的空间划分和编码方案。裁剪一条线段时,先求出两端点所在的区号code1和code2,若code1 = 0且code2 = 0,则说明线段的两个端点均在窗口内,那么整条线段必在窗口内,应取之;若code1和code2经按位与运算的结果不为0,则说明两个端点同在窗口的上方、下方、左方或右方。这种情况下,对线段的处理是弃之。如果上述两种条件都不成立,则按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可弃之,对另一段则重复上述处理。实验代码#includeGL/glut.h#includestdio.h#includestdlib.h#define LEFT_EDGE 1#define RIGHT_EDGE 2#define BOTTOM_EDGE 4#define TOP_EDGE 8void LineGL(int x0,int y0,int x1,int y1){glBegin(GL_LINES);glColor3f(1.0f,0.0f,0.0f);glVertex2f(x0,y0);glColor3f(0.0f,1.0f,0.0f);glVertex2f(x1,y1);glEnd();}struct Rectangle{float xmin,xmax,ymin,ymax;};Rectangle rect;int x0,y0,x1,y1;int CompCode(int x,int y,Rectangle rect){//求端点所在区号int code=0x00;if(yrect.ymin)code=code|4;//0100下if(yrect.ymax)code=code|8;//1000上if(xrect.xmax)code=code|2;//0010右if(xrect.xmin)code=code|1;//0001左return code;}int cohensutherlandlineclip(Rectangle rect,int x0,int y0,int x1,int y1){int accept,done;float x,y;accept=0;done=0;int code0,code1,codeout;code0=CompCode(x0,y0,rect);code1=CompCode(x1,y1,rect);do{if(!(code0|code1)){//端点均在视区内accept=1;//取done=1;}else if(code0code1){//端点在视区外侧x0=y0=x1=y1=0;done=1;accept=1;}else{if(code0!=0){codeout=code0;}else{codeout=code1;}if(codeoutLEFT_EDGE){y=y0+(y1-y0)*(rect.xmin-x0)/(x1-x0);//直线与视区边界 的交点x=(float)rect.xmin;}else if(codeoutRIGHT_EDGE){y=y0+(y1-y0)*(rect.xmax-x0)/(x1-x0);x=(float)rect.xmax;}else if(codeoutBOTTOM_EDGE){x=x0+(x1-x0)*(rect.ymin-y0)/(y1-y0);y=(float)rect.ymin;}else if(codeoutTOP_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);}}}while(!done);if(accept){LineGL(x0,y0,x1,y1);}return accept;}void myDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glRectf(rect.xmin,rect.ymin,rect.

文档评论(0)

baoyue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档