Tubor C 直线裁剪算法 Cohen-Sutherland算法 (可运行代码)

因为TuborC 程序的编辑页面的宽度最多是250,所以为了控制edit时候的代码宽度,所以直接全部左对齐。

(下面程序暂时不能裁剪 斜率为零 或者 斜率不存在的情况, 近期将完善更新)

#include <graphics.h> 
#include <stdio.h>  
int x_min,x_max,y_min, y_max; 
main() 
{   
int driver,mode; 
int x1,y1,x2,y2;   
x_min=150; y_min=100; 
x_max=500; y_max=300; 
driver=DETECT;  
initgraph(&driver,&mode,"c:\\tc\\bgi"); 
draw_win(3);  
x1=60;y1=120;x2=580;y2=270; 
line(x1,480-y1,x2,480-y2); 
getch();  
clipline(x1,y1,x2,y2);  

x1=200;y1=360;x2=280;y2=250; 
setcolor(7);  
line(x1,480-y1,x2,480-y2); 
getch();  
clipline(x1,y1,x2,y2); 

x1=350;y1=170;x2=550;y2=200; 
setcolor(7);  
line(x1,480-y1,x2,480-y2); 
getch();  
clipline(x1,y1,x2,y2); 

x1=260;y1=150;x2=220;y2=60; 
setcolor(7);  
line(x1,480-y1,x2,480-y2); 
getch();  
clipline(x1,y1,x2,y2); 

x1=50;y1=150;x2=50;y2=150; 
setcolor(7);  
line(x1,480-y1,x2,480-y2); 
getch();  
clipline(x1,y1,x2,y2); 

x1=150;y1=50;x2=150;y2=400; 
setcolor(7);  
line(x1,480-y1,x2,480-y2); 
getch();  
clipline(x1,y1,x2,y2); 

getch();  
closegraph(); 
}  

clipline(int x1,int y1,int x2,int y2) 
{  
int i,code1[4],code2[2],display; 
float k;  
display=0;  

k = (float)(y2-y1)/(float)(x2-x1); 

while(1) 
{  
encode(x1,y1,code1); 
encode(x2,y2,code2); 
if(accept(code1,code2)) 
{  
display=1; 
break; 
}  
else if(reject(code1,code2)) 
{  
break; 
}  
if(swapyn(code1,code2)==1){
int t;
t = x1;
x1 = x2;
x2 = t;
t = y1;
y1 = y2;
y2 = t;
} 

if(code1[0])   
{
x1 = x1 + (y_max-y1)/k;
y1 = y_max;
}
else if(code1[1])
{
x1 = x1 + (y_min-y1)/k;
y1 = y_min;
}
else if(code1[2])
{
y1 = y1 + (x_max-x1)*k; 
x1 = x_max;
}
else if(code1[3])
{
y1 = y1 + (x_min-x1)*k;
x1 = x_min;
}

}  
if(display==1) {
setcolor(4);  
line(x1,480-y1,x2,480-y2); }
} 


encode(int x,int y,int code[])
{
int i;
for(i=0; i<4; i++)  
code[i]=0;
if(y > y_max) 
code[0]=1;
if(y < y_min) 
code[1]=1;
if(x > x_max) 
code[2]=1;
if(x < x_min) 
code[3]=1;
}

accept(int code1[],int code2[]) 
{  
int i,flag; 
flag=1;  
for(i=0;i<4;i++)  
if((code1[i]==1)||(code2[i]==1)) 
{  
flag=0; 
break; 
}  
return flag; 
} 
  

reject(int code1[],int code2[]) 
{  
int i,flag; 
flag=0;  
for(i=0;i<4;i++)  
if((code1[i]==1)&&(code2[i]==1)) 
{  
flag=1; 
break; 
}  
return flag; 
} 
  

swapyn(int code1[],int code2[])
{
int i,flag1,flag2,tmp;
flag1=0;
if(code1[0]+code1[1]+code1[2]+code1[3] !=0)
flag1 = 1;
flag2=0;
if(code2[0]+code2[1]+code2[2]+code2[3] !=0)
flag2 = 1;
if(flag1==1 && flag2==1)    
return 0;
else if(flag1==0 && flag2==1) 
{
  for(i=0; i<4; i++) {
  tmp = code1[i];
  code1[i] = code2[i];
  code2[i] = tmp;
}
return  1;
 }
 else
return  0;
}


draw_win(int c) 
{  
setcolor(c);  
line(x_min,480-y_min,x_max,480-y_min); 
line(x_max,480-y_min,x_max,480-y_max); 
line(x_max,480-y_max,x_min,480-y_max); 
line(x_min,480-y_max,x_min,480-y_min); 
setcolor(7); 
getch(); 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值