編碼裁剪算法
用任意顏色繪制窗口,並用一種顏色繪制線段,利用編碼裁剪算法對線段進行裁剪。要求能夠演示出裁剪過程,裁剪前的圖形要繪出,當按下任意按鍵,繪制出裁剪結果。請使用TC打開源程序:
#include<stdio.h>
#include<graphics.h>
#define LEFT 1
#define RIGHT 2
#define BOTTOM 4
#define TOP 8
#define FALSE 0
#define TRUE 1
void Line_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax)
float x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax;
{
int draw,done;
int code1,code2,code;
float x,y;
draw=FALSE;done=FALSE;
code1=get_code(x1,y1,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
code2=get_code(x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
while(!done)
{
if(code1==0&&code2==0)
{
draw=TRUE;done=TRUE;
}
else if(code1&code2!=0)
{
done =TRUE;
}else
{
if(code1!=0)
code=code1;
else
code=code2;
if((code&TOP)!=0)
{y=yw_ymax;
x=x1+(y-y1)*(x2-x1)/(y2-y1);
}
else if((code&BOTTOM)!=0)
{
y=yw_ymin;
x=x1+(y-y1)*(x2-x1)/(y2-y1);
}
else if((code&RIGHT)!=0)
{
x=xw_xmax;
y=y1+(x-x1)*(y2-y1)/(x2-x1);
}
else if((code&LEFT)!=0)
{
x=xw_xmin;
y=y1+(x-x1)*(y2-y1)/(x2-x1);
}
if(code==code1)
{
x1=x;
y1=y;
code1=get_code(x1,y1,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
}
else
{
x2=x;
y2=y;
code2=get_code(x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
}
}
if(draw)
{
setcolor(8);
line(x1,y1,x2,y2);
}
}
}
int get_code(x,y,xw_xmin,yw_ymin,xw_xmax,yw_ymax)
float x,y,xw_xmin,yw_ymin,xw_xmax,yw_ymax;
{
int code;
code=0;
if(y>yw_ymax)
code|=TOP;
else if(y<yw_ymin)
code|=BOTTOM;
if(x>xw_xmax)
code|=RIGHT;
else if(x<xw_xmin)
code|=LEFT;
return code;
}
void main()
{
float x1=76,y1=40,x2=60,y2=80,xw_xmin=50,xw_xmax=80,yw_ymin=50,yw_ymax=70;
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"C:\\TURBOC2");
setcolor(5);
line(x1,y1,x2,y2);
rectangle(xw_xmin,yw_ymin,xw_xmax,yw_ymax);
getch();
cleardevice();
setcolor(8);
rectangle(xw_xmin,yw_ymin,xw_xmax,yw_ymax);
Line_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
getch();
closegraph();
}