裁剪用C语言,多边形裁剪

[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;

}

}

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值