算法过程 裁剪一条线段时,先求出PP2所在的区号 code1,code2。 °(1)若code1=0,且code2=0,则线段P1P2在窗口内,应 取之 ●(2)若按位与运算code1&code2≠0,则说明两个端点同 在窗口的上方、下方、左方或右方。可判断线段完全在窗 口外,可弃之 (3)否则,按第三种情况处理。求出线段与窗口某边的 交点,在交点处把线段一分为二,其中必有一段在窗口外, 可弃之。在对另一段重复上述处理。 在实现本算法时,不必把线段与每条窗口边界依次 求交,只要按顺序检测到端点的编码不为0,才把线 段与对应的窗口边界求交。 特点:对显然不可见线段的快速判别
算法过程 裁剪一条线段时,先求出P1P2所在的区号 code1,code2。 l (1)若code1=0,且code2=0,则线段P1P2在窗口内,应 取之。 l (2)若按位与运算code1&code2≠0,则说明两个端点同 在窗口的上方、下方、左方或右方。可判断线段完全在窗 口外,可弃之。 l (3)否则,按第三种情况处理。求出线段与窗口某边的 交点,在交点处把线段一分为二,其中必有一段在窗口外, 可弃之。在对另一段重复上述处理。 在实现本算法时,不必把线段与每条窗口边界依次 求交,只要按顺序检测到端点的编码不为0,才把线 段与对应的窗口边界求交。 特点:对显然不可见线段的快速判别
Cohen- Sutherland裁减算法 ●# define left1 ●void ●# define r|GHT2 CS Line Clip(x1, y1, X2, y2, XL, XR,Y ●# define bottom4 B,YT) ●# define TOP8 e float x1,y1, X2, y2, XL, XR,YB,YT e int encode(float x, float y) ∥(X1,y1)(x2,y2)为线段的端点坐标 其他四个参数定义窗口的边界 ●{intc=0; s int code 1, code2, code, if(X<XL)c=LEFT if(X>XR)c=RIGHT code1= encode(x1y1)/端点编码 if(X<YB)cBOTTOM code2= encode(x2y2)/(点编码 ●f(x≤YT)cl=TOP; ● retrun c
Cohen-Sutherland裁减算法 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 int encode(float x,float y) { int c=0; if(x<XL) c|=LEFT; if(x>XR) c|=RIGHT; if(x<YB) c|=BOTTOM; if(x<YT) c|=TOP; retrun c; } void CS_LineClip(x1,y1,x2,y2,XL,XR,Y B,YT) float x1,y1,x2,y2,XL,XR,YB,YT; //(x1,y1)(x2,y2)为线段的端点坐标, 其他四个参数定义窗口的边界 { int code1,code2,code; code1=encode(x1,y1);//端点编码 code2=encode(x2,y2);//端点编码
Cohen- Sutherland裁减算法 e while(code1=0 c else if(RIGHT&code =0) Icode2=0) IX=XR; f if(code 1&code2 =0) y=y1+(y2y1)*(XR-×1)/(X2 return X code code 1 if(code 1==0)code else if(BOT TOM&code 1=0) code2 Ly=YB f(LEFT&code 1=0)- x=x1+(x2-x1)* (YB-y1)/(y2-y1) IX=XL 1)(X2-×1) y1+(y2-y1)*(XL-e else if(TOP& code [=0) Ly=YT x=x1+(X2×1)CYTy1)/(y2y1)
Cohen-Sutherland裁减算法 while(code1!=0 ||code2!=0) { if(code1&code2 !=0) return; code = code1; if(code1==0) code = code2; if(LEFT&code !=0) { x=XL; y=y1+(y2-y1)*(XL- x1)/(x2-x1); } else if(RIGHT&code !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2- x1); } else if(BOTTOM&code !=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1); } else if(TOP & code !=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1); }
Cohen- Sutherland裁减算法 e if(code ==code 1) ●{X1=xy1=y;code1 encode(x,y); 1 ●e|se ●{X2=xy2=y;code2 = encode(X,y)丹} displaying (X1,y1,X2y2);
Cohen-Sutherland裁减算法 if(code ==code1) { x1=x;y1=y; code1 =encode(x,y);} else { x2=x;y2=y; code2 =encode(x,y);} } displayline (x1,y1,x2,y2); }
example
example