资源描述:
《计算机图形学实验Cohen-Sutherland算法.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验5-6一、实验题目请按照图5-32所示,使用对话框输入直线段的起点和终点坐标。在屏幕客户区左侧区域绘制输入直线段和“窗口”,在屏幕客户区右侧区域绘制“视区”并输出裁剪结果。这里需要用到窗视变换公式。请使用Cohen-Sutherland算法编程实现。二、实验思想Cohen-Sutherland直线裁剪算法是最早流行的编码算法。每条直线的端点都被赋予一组四位二进制代码,称为区域编码(RegionCode,RC),用来标识直线端点相对于窗口边界及其延长线的位置。假设窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(
2、x=wxr)四条边组成,如图5-23所示。延长窗口四条边形成9个区域,如图5-24所示。这样根据直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码RC=C4C3C2C1。为了保证窗口内直线端点的编码为零,编码规则定义如下:第一位:若端点位于窗口之左侧,即xwxr,则C2=1,否则C2=0。第三位:若端点位于窗口之下侧,即ywyt,则C4=1,否则C4=0。裁剪步骤如下:(1)
3、若直线的两个端点的区域编码都为零,即RC1
4、RC2=0,说明直线两端点都在窗口内,应“简取”之。(2)若直线的两个端点的区域编码都不为零,即RC1&RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”之。(3)若直线既不满足“简取”也不满足“简弃”的条件,直线必然与窗口或窗口边界的延长线相交,需要计算直线与窗口边界的交点。交点将直线分为两段,其中一段完全位于窗口外,可“简弃”之。对另一段重复进行上述处理,直至该直线段完全被舍弃或找到完全位于窗口内的直线段为止。三、程序代码voidCTestView::clip(dou
5、blexw1,doubleyw1,doublexw2,doubleyw2)//裁剪函数{doublexv1,yv1,xv2,yv2;doublex,y;BOOLChange;CClientDCdc(this);RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);while(TRUE){Change=FALSE;if((RC1
6、RC2)==0){//简取之xv1=a*xw1+b;yv1=c*yw1+d;xv2=a*xw2+b;yv2=c*yw2+d;//计算视区坐标dc.MoveTo(ROUND(xv1),ROUN
7、D(yv1));dc.LineTo(ROUND(xv2),ROUND(yv2));return;}elseif((RC1&RC2)!=0){//简弃之return;}else{if(RC1==0)//如果P1点在窗口内,交换P1和P2,保证p1点在窗口外{//交换点的坐标值doubletx,ty;tx=xw1;ty=yw1;xw1=xw2;yw1=yw2;xw2=tx;yw2=ty;//交换点的编码值unsignedintRC;RC=RC1;RC1=RC2;RC2=RC;}if(RC1&LEFT)//P1点位于窗口的左侧{x=wxl;y=y
8、w1+(yw2-yw1)*(x-xw1)/(xw2-xw1);xw1=x;yw1=y;Change=TRUE;RC1=EnCode(xw1,yw1);RC2=EnCode(xw2,yw2);}if(RC1&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-xw
9、1)*(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;}}}}unsignedintCTestView::EnCode(
10、doublex,doubley)//编码函数{//顺序左右下上unsignedintRC=0;if(x11、LEFT;}if(x>wxr){RC=RC
12、RIGH