编码裁剪算法
编码裁剪算法
用任意颜色绘制窗口,并用一种颜色绘制线段,利用编码裁剪算法对线段进行裁剪。要求能够演示出裁剪过程,裁剪前的图形要绘出,当按下任意按键,绘制出裁剪结果。请使用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();
}
摘自 pzhsunxu的专栏
补充:软件开发 , C语言 ,