首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

图形学 多边形的剪裁 sutherland解决办法

2012-02-05 
图形学 多边形的剪裁 sutherland我最近在学高等教育出版社的计算机图形学 用的书上56页的多边形剪裁算法加

图形学 多边形的剪裁 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

热点排行