计算机图形学实验CohenSutherland算法_第1页
计算机图形学实验CohenSutherland算法_第2页
计算机图形学实验CohenSutherland算法_第3页
计算机图形学实验CohenSutherland算法_第4页
计算机图形学实验CohenSutherland算法_第5页
全文预览已结束

下载本文档

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

文档简介

1、实验5-6一、实验题目请按照图5-32所示,使用对话框输入直线段的起点和终点坐标。在屏幕客户区左侧区域绘制输入直线段和“窗口”,在屏幕客户区右侧区域绘制“视区”并输出裁剪结果。这里需要用到窗视变换公式。请使用Cohen-Sutherland算法编程实现。二、实验思想 Cohen-Sutherland直线裁剪算法是最早流行的编码算法。每条直线的端点都被赋予一组四位二进制代码,称为区域编码(Region Code,RC),用来标识直线端点相对于窗口边界及其延长线的位置。假设窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边组成,如图5-23所示。延长窗口

2、四条边形成9个区域,如图5-24所示。这样根据直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码RCC4C3C2C1。 为了保证窗口内直线端点的编码为零,编码规则定义如下: 第一位:若端点位于窗口之左侧,即x<wxl ,则C1=1,否则C1=0。 第二位:若端点位于窗口之右侧,即x>wxr,则C2=1,否则C2=0。 第三位:若端点位于窗口之下侧,即y<wyb,则C3=1,否则C3=0。 第四位:若端点位于窗口之上侧,即y>wyt,则C4=1,否则C4=0。裁剪步骤如下:(1)若直线的两个端点的区域编码都为零,即RC1|RC2=0,说明直线两端点

3、都在窗口内,应“简取”之。(2)若直线的两个端点的区域编码都不为零,即RC1&RC20,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”之。(3)若直线既不满足“简取”也不满足“简弃”的条件,直线必然与窗口或窗口边界的延长线相交,需要计算直线与窗口边界的交点。交点将直线分为两段,其中一段完全位于窗口外,可“简弃”之。对另一段重复进行上述处理,直至该直线段完全被舍弃或找到完全位于窗口内的直线段为止。三、程序代码void CTestView:clip(double xw1,double yw1,double xw2,double yw2)/裁剪函数double xv1,yv

4、1,xv2,yv2;double x,y;BOOL Change;CClientDC dc(this);RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);while(TRUE)Change=FALSE;if( (RC1 | RC2)=0)/简取之xv1=a*xw1+b;yv1=c*yw1+d;xv2=a*xw2+b;yv2=c*yw2+d;/计算视区坐标dc.MoveTo(ROUND(xv1),ROUND(yv1);dc.LineTo(ROUND(xv2),ROUND(yv2);return;else if(RC1 & RC2)!=0)/简弃之return

5、;elseif(RC1=0)/如果P1点在窗口内,交换P1和P2,保证p1点在窗口外/交换点的坐标值double tx,ty;tx=xw1;ty=yw1;xw1=xw2;yw1=yw2;xw2=tx;yw2=ty;/交换点的编码值unsigned int RC;RC=RC1;RC1=RC2;RC2=RC;if(RC1 & LEFT )/P1点位于窗口的左侧x=wxl;y=yw1+(yw2-yw1)*(x-xw1)/(xw2-xw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(RC1 &

6、RIGHT )/P1点位于窗口的右侧x=wxr;y=yw1+(yw2-yw1)*(x-xw1)/(xw2-xw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(RC1 & BOTTOM )/P1点位于窗口的下侧y=wyb;x=xw1+(xw2-xw1)*(y-yw1)/(yw2-yw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(RC1 & TOP )/P1点位于窗口的上侧y=wyt;x=xw1+(xw2-xw1)*(y-yw1)/(yw2-yw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);if(Change=FALSE)return;unsigned int CTestView:EnCode(double x,double y)/编码函数/顺序左右下上unsigned int RC=0;if(x<wxl)RC=

温馨提示

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

评论

0/150

提交评论