梁友栋裁剪算法
用任意颜色绘制窗口,并用一种颜色绘制线段,利用P181页所示梁友栋裁剪算法对线段进行裁剪。要求能够演示出裁剪过程,裁剪前的图形要绘出,当按下任意按键,绘制出裁剪结果。请使用TC打开源程序:
#include "graphics.h"
#include "stdio.h"
#define FALSE 0
#define TRUE 1
int Clip_test(float q,float d,float *t0,float *t1)
{
float r;
if(q<0)
{
r=d/q;
if(r>*t1)
return(FALSE);
else if(r>*t0)
{
*t0=r;
return(TRUE);
}
}
else if(q>0)
{
r=d/q;
if(r<*t0)
return(FALSE);
else if(r<*t1)
{
*t1=r;
return(TRUE);}
}
else if(d<0)
return(FALSE);
return (TRUE);
}
void Line_Clipping(int x1,int y1,int x2,int y2,int xwmin,int ywmin,int xwmax,int ywmax)
{
float dx,dy,t0,t1;
t0=0;
t1=1;
dx=x2-x1;
if(Clip_test(-dx,x1-xwmin,&t0,&t1))
if(Clip_test(dx,xwmax-x1,&t0,&t1))
{
dy=y2-y1;
if(Clip_test(-dy,y1-ywmin,&t0,&t1))
if(Clip_test(dy,ywmax-y1,&t0,&t1))
{
if(t1<1)
{
x2=x1+t1*dx;
y2=y1+t1*dy;
}
if(t0>0)
{
x1=x1+t0*dx;
y1=y1+t0*dy;
}
line(x1,y1,x2,y2);
}
}
}
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=0;
initgraph(&gdriver,&gmode,"C:\\TURBOC2");
setcolor(6);
rectangle(xw_xmin,yw_ymin,xw_xmax,yw_ymax);
line(x1,y1,x2,y2);
getch();
cleardevice();
setcolor(7);
Line_Clipping(x1,y1,x2,y2,xw_xmin,yw_ymin,xw_xmax,yw_ymax);
setcolor(4);
rectangle(xw_xmin,yw_ymin,xw_xmax,yw_ymax);
getch();
restorecrtmode();
}