[c]代码库#include"conio.h"
#include"graphics.h"
#define right 1
#define bottom 2
#define left 3
#define top 4
#define N 20
void clip_polygon (int Xwmax,int Xwmin,int Ywmax,int Ywmin,int& n,int *x,int *y);
void clip_single_edge(int edge,int type,int& nin,int *xin,int *yin,int& nout,int *xout,int *yout);
void test_intersect(int edge,int type,int x1,int y1,int x2, int y2, int& xout,int& yout,int& yes,int& is_in);
void main()
{
int i;
int xwmax=400, xwmin=200,ywmax=400,ywmin=200,n=7;
int x[]={500,300,300,100,351,80,380};
int y[]={320,125,450,320,242,420,350};
initgraph(640,640);
setcolor(YELLOW);
rectangle(200,200,400,400);
outtextxy(200,20,"按回车键开始剪裁");
setcolor(RED);
for(i=0;i
{
moveto(x[i],y[i]);
if(i+1!=n)
lineto(x[i+1],y[i+1]);
else lineto(x[0],y[0]);
}
getch();
cleardevice();
setcolor(YELLOW);
rectangle(200,200,400,400);
clip_polygon(xwmax,xwmin,ywmax,ywmin,n,x,y);
getch();
closegraph();
}
void clip_polygon (int Xwmax,int Xwmin,int Ywmax,int Ywmin,int& n,int *x,int *y)
{ int x1[N],y1[N],x2[N],y2[N],n1;
clip_single_edge(Xwmax,right,n,x,y,n1,x1,y1);
clip_single_edge(Ywmax,bottom,n1,x1,y1,n1,x2,y2);
clip_single_edge(Xwmin,left,n1,x2,y2,n1,x1,y1);
clip_single_edge(Ywmin,top,n1,x1,y1,n1,x2,y2);
setcolor(GREEN);
for(int i=0;i
{
moveto(x2[i],y2[i]);
if(i+1!=n1)
lineto(x2[i+1],y2[i+1]);
else lineto(x2[0],y2[0]);
}
}
void clip_single_edge(int edge,int type,int& nin,int *xin,int *yin,int& nout,int *xout,int *yout)
{
int k=0, yes, is_in;
int x, y, x_intersect, y_intersect;
x=xin[nin-1];y=yin[nin-1];
for(int j=0; j
{
test_intersect(edge, type, x, y,xin[j], yin[j],x_intersect,y_intersect,yes,is_in);
if(yes)
{
xout[k]=x_intersect;
yout[k]=y_intersect;
k++;
}
if(is_in)
{
xout[k]=xin[j];
yout[k]=yin[j];
k++;
}
x=xin[j];
y=yin[j];
}
nout=k;
}
void test_intersect(int edge,int type,int x1,int y1,int x2, int y2, int& xout,int& yout,int& yes,int& is_in)
{
float m;
is_in=yes=0;
if(x1!=x2)
m=(float)((float)y2-(float)y1)/((float)x2-(float)x1);
switch(type)
{
case right :
if (x2
{
is_in=1;
if(x1>edge)
yes=1;
}
else
if(x1<=edge)
yes=1;
break;
case bottom:
if(y2<=edge)
{
is_in=1;
if(y1>edge)
yes=1;
}
else
if(y1<=edge)
yes=1;
break;
case left:
if(x2>=edge)
{
is_in=1;
if(x1
yes=1;
}
else
if(x1>=edge)
yes=1;
break;
case top :
if(y2>=edge)
{
is_in=1;
if(y1
yes=1;
}
else
if(y1>=edge)
yes=1;
default: break;
}
if(yes)
if((type==right) || (type==left))
{
xout = edge;
yout=(y1+m*(xout-x1));
}
else
if(x1==x2)
{
if(type==2&&(y1<=edge||y2<=edge))
{xout=x1;yout=edge;}
if(type==4&&(y1>=edge||y2>=edge))
{xout=x1;yout=edge;}
}
else
{
yout=edge; xout=x1+(yout-y1)/m;
}
}