图形学 多边形的剪裁 sutherland
我最近在学高等教育出版社的计算机图形学 用的书上56页的多边形剪裁算法加了个主函数,不过总是有问题,请哪位大侠帮帮忙
程序如下 用tc编译的
#include<graphics.h>
#include<malloc.h>
#define right 1
#define bottom 2
#define left 3
#define top 4
clip_polygon(int xwmax,int xwmin,int ywmax,int ywmin,int n,int *x,int *y)
{int *x1,*y1,*n1,*n2;
clip_single_edge(xwmax,right,n,x,y,n1,&x1,&y1);
clip_single_edge(ywmin,bottom,*n1,x1,y1,n2,&x,&y);
clip_single_edge(xwmin,left,*n2,x,y,n,&x1,&y1);
clip_single_edge(ywmax,top,*n1,x1,y1,n2,&x,&y);
return *n2;
}
clip_single_edge(int edge,int type,int nin,int *xin,int *yin,int *nout,int *xout,int *yout)
{int i,k,*yes,*is_in;
int x,y,*x_intersect,*y_intersect;
x=xin[nin-1];
y=yin[nin-1];
k=0;
for(i=0;i<nin;i++)
{test_intersect(edge,type,x,y,xin[i],yin[i],x_intersect,y_intersect,yes,is_in);
if(*yes)
{xout[k]=x_intersect;
yout[k]=y_intersect;
k++;
}
if(*is_in)
{xout[k]=xin[i];
yout[k]=yin[i];
k++;}
*nout=k;
x=xin[i];
y=yin[i];
}
}
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=0;
*yes=0;
if(x1!=x2)
m=(y2-y1)/(x2-x1);
switch(type)
{case right:
if(x2<=edge){*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<edge) *yes=1;
}
else if(x1>=edge) *yes=1;
break;
case top:
if(y2<=edge){*is_in=1;
if(y1>edge) *yes=1;
}
else if(y1<=edge) *yes=1;
default:break;
}
if(x1!=x2)
if(yes&&((type==1)||(type==3)))
{*xout=edge;*yout=y1+m*(*xout-x1);}
else
{*yout=edge;*xout=x1+(*yout-y1/m);}
else
{
*xout=x1;
*xout=edge;
}
}
main()
{ int driver=0,mode=0;
int xwmax=100, xwmin=40,ywmax=100,ywmin=40,n=3;
int i;
int *polypoints2;
int polypoints1[8]={10,10,70,120,90,130,10,10};
int x[100],y[100];
initgraph(&driver,&mode,"C:\\TC");
rectangle(xwmin,ywmin,xwmax,ywmax);
drawpoly(4,polypoints1);
getch();
cleardevice();
for(i=0;i<n;i++)
{
x[i]=polypoints1[2*i];
y[i]=polypoints1[2*i+1];
}
rectangle(xwmin,ywmin,xwmax,ywmax);
n=clip_polygon(xwmax,xwmin,ywmax,ywmin,n,x,y);
polypoints2=(int*)malloc(2*(n+1));
for(i=0;i<n;i++)
{
*(polypoints2+2*i)=x[i];
*(polypoints2+2*i+1)=y[i];
}
*(polypoints2+n-2)=x[0];
*(polypoints2+n-1)=y[0];
drawpoly(n+1,polypoints2);
getch();
closegraph();
}
[解决办法]
oo