#include <graphics.h>
#include <stdio.h>
void main()
{
int p[10][2],q[20][2],n,i,k,temp_x,temp_y; /*p[][0]表示x坐标 p[][1]表示y坐标*/
int left=200,right=400,bottom=100,top=200;
int gdriver=DETECT,gmode;
printf("请输入带切割多边形的数据!\n");
printf("带切割多边形的定点数为:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("请输入X(%d)的值:",i+1);
scanf("%d",&p[i][0]);
printf("请输入Y(%d)的值:",i+1);
scanf("%d",&p[i][1]);
}
p[n][0]=p[0][0];
p[n][1]=p[0][1];
initgraph(&gdriver,&gmode,"");
setcolor(BLUE);
for(i=0;i<n;i++)
{
line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]);
}
getchar();
setcolor(WHITE);
line(left,top,right,top);
line(left,bottom,right,bottom);
line(left,top,left,bottom);
line(right,top,right,bottom); //绘制边框和裁剪图形
for(i=0,k=0;i<n;i++)
{ //左边切割
if(p[i][0]<left && p[i+1][0]>=left)
{
temp_x=left;
temp_y=p[i][1]+((left-p[i][0])*(p[i+1][1]-p[i][1])/(p[i+1][0]-p[i][0]));
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][0]>=left && p[i+1][0]>=left)
{
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][0]>=left && p[i+1][0]<left)
{
temp_x=left;
temp_y=p[i][1]+((left-p[i][0])*(p[i+1][1]-p[i][1])/(p[i+1][0]-p[i][0]));
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
}
}
n=k;
for(i=0;i<n;i++)
{
p[i][0]=q[i][0];
p[i][1]=q[i][1];
}
p[n][0]=q[0][0];
p[n][1]=q[0][1];
for(i=0,k=0;i<n;i++)
{ //顶边切割
if(p[i][1]>top && p[i+1][1]<=top)
{
temp_x=p[i][0]+((top-p[i][1])*(p[i+1][0]-p[i][0])/(p[i+1][1]-p[i][1]));
temp_y=top;
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][1]<=top && p[i+1][1]<=top)
{
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][1]<=top && p[i+1][1]>top)
{
temp_x=p[i][0]+((top-p[i][1])*(p[i+1][0]-p[i][0])/(p[i+1][1]-p[i][1]));
temp_y=top;
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
}
}
n=k;
for(i=0;i<n;i++)
{
p[i][0]=q[i][0];
p[i][1]=q[i][1];
}
p[n][0]=q[0][0];
p[n][1]=q[0][1];
for(i=0,k=0;i<n;i++)
{ //右边切割
if(p[i][0]>right && p[i+1][0]<=right)
{
temp_x=right;
temp_y=p[i][1]+((right-p[i][0])*(p[i+1][1]-p[i][1])/(p[i+1][0]-p[i][0]));
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][0]<=right && p[i+1][0]<=right)
{
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][0]<=right && p[i+1][0]>right)
{
temp_x=right;
temp_y=p[i][1]+((right-p[i][0])*(p[i+1][1]-p[i][1])/(p[i+1][0]-p[i][0]));
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
}
}
n=k;
for(i=0;i<n;i++)
{
p[i][0]=q[i][0];
p[i][1]=q[i][1];
}
p[n][0]=q[0][0];
p[n][1]=q[0][1];
for(i=0,k=0;i<n;i++)
{ //底边切割
if(p[i][1]<bottom && p[i+1][1]>=bottom)
{
temp_x=p[i][0]+((bottom-p[i][1])*(p[i+1][0]-p[i][0])/(p[i+1][1]-p[i][1]));
temp_y=bottom;
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][1]>=bottom && p[i+1][1]>=bottom)
{
q[k][0]=p[i+1][0];
q[k][1]=p[i+1][1];
k++;
}
else if(p[i][1]>=bottom && p[i+1][1]<bottom)
{
temp_x=p[i][0]+((bottom-p[i][1])*(p[i+1][0]-p[i][0])/(p[i+1][1]-p[i][1]));
temp_y=bottom;
q[k][0]=temp_x;
q[k][1]=temp_y;
k++;
}
}
n=k;
for(i=0;i<n;i++)
{
p[i][0]=q[i][0];
p[i][1]=q[i][1];
}
p[n][0]=q[0][0];
p[n][1]=q[0][1]; //切割完成
getchar();
setcolor(YELLOW);
for(i=0;i<n;i++)
{
line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]);
}
getchar();
closegraph();
}