多边形逐次裁剪.docx
《多边形逐次裁剪.docx》由会员分享,可在线阅读,更多相关《多边形逐次裁剪.docx(27页珍藏版)》请在冰豆网上搜索。
多边形逐次裁剪
计算机图形学作业:
多边形逐次裁剪
姓名:
学号:
专业:
时间:
一、主程序流程图
用矩形右边裁剪多边形
输出裁剪后的多边形的
各个顶点坐标到指定的
数组
初始化多边形坐标参
数,利用函数绘制多边形
画出裁剪后的多边形
用矩形左边裁剪多边形
用矩形下边裁剪多边形
输出裁剪后的多边形的
各个顶点坐标到指定的数组输出裁剪后的多边形的各
个顶点坐标到指定的数组
画出裁剪后的多边形
画出裁剪后的多边形
用矩形上边裁剪多边形
输出裁剪后的多边形的
各个顶点坐标到指定的
数组
画出裁剪后的多边形
线段的裁剪方框图
取线段初始点s和终点p
s、p都不可见Y不用输出
N
s、p都可见Y输出p
N
s可见、p不可见Y输出交点
N
s不可见、p可见Y输出交点和p
二、程序:
#include
#include
#definemax8
/*裁剪矩形*/
floatxmax=200,ymax=190,xmin=30,ymin=25;
/*线段起点SX,SY,线段终点PX,PY,交点jdx,jdy*/
floatSX,SY,PX,PY,jdx,jdy;
/*标志符*/
intflag;
/*求交点函数*/
voidxjsub(floatx1,floaty1,floatx2,floaty2,floatx3,floaty3,floatx4,floaty4)
{
floata1,a2,b1,b2,fms;
a1=y2-y1;b1=x2-x1;
a2=y4-y3;b2=x4-x3;
fms=1/(a2*b1-a1*b2);
jdy=(a1*a2*(x3-x1)+a2*b1*y1-a1*b2*y3)*fms;
jdx=b2*(jdy-y3)/a2+x3;
return;
}
/*左边裁剪*/
voidleftclip(floatsx,floatsy,floatpx,floatpy)
{
if(sx{
flag=0;
}
else
if(sx>=xmin&&px>=xmin)/*都可见*/
{
flag=3;
PX=px;PY=py;/*SX=sx;SY=sy;*/
}
else
if(sxxmin)/*p可见,s不可见*/
{
flag=2;
xjsub(sx,sy,px,py,xmin,ymin,xmin,ymax);
SX=jdx;SY=jdy;
PX=px;PY=py;
}
else
{
/*s可见,P不可见*/
flag=1;
xjsub(px,py,sx,sy,xmin,ymin,xmin,ymax);
SX=jdx;SY=jdy;/*PX=px;PY=py;*/
}
}
/*上边裁剪*/
voidupclip(floatsx,floatsy,floatpx,floatpy)
{
if(sy>ymax&&py>ymax)
{
flag=0;
}/*都在上面不可见*/
else
if(sy{
flag=3;
PX=px;
PY=py;/*SX=sx;SY=sy;*/
}
else
if(syymax)/*s可见,P不可见*/
{
flag=1;
xjsub(xmin,ymax,xmax,ymax,sx,sy,px,py);
SX=jdx;
SY=jdy;/*PX=px;PY=py;*/
}
else
if(pyymax)/*p可见,s不可见*/
{
flag=2;
xjsub(xmin,ymax,xmax,ymax,px,py,sx,sy);
SX=jdx;
SY=jdy;
PX=px;
PY=py;
}
}
/*右边裁剪*/
voidrightclip(floatsx,floatsy,floatpx,floatpy)
{
if(sx>xmax&&px>xmax)
{
flag=0;
}/*都在右面不可见*/
else
if(sx{
flag=3;
PX=px;
PY=py;/*SX=sx;SY=sy;*/
}
else
if(sxxmax)/*s可见,P不可见*/
{
flag=1;
xjsub(sx,sy,px,py,xmax,ymin,xmax,ymax);
SX=jdx;
SY=jdy;/*PX=px;PY=py;*/
}
else
if
(pxymax)/*p可见,s不可见*/
{
flag=2;
xjsub(px,py,sx,sy,xmax,ymin,xmax,ymax);
SX=jdx;
SY=jdy;
PX=px;
PY=py;
}
}
/*下边裁剪*/
voidbottomclip(floatsx,floatsy,floatpx,floatpy)
{
if(sy{
flag=0;
}/*都在下边不可见*/
else
if(sy>ymin&&py>ymin)/*都可见*/
{
flag=3;
PX=px;
PY=py;/*SX=sx;SY=sy;*/
}
else
if(sy>ymin&&py{
flag=1;
xjsub(xmin,ymin,xmax,ymin,px,py,sx,sy);
SX=jdx;
SY=jdy;/*PX=px;PY=py;*/
}
else
if(py>ymin&&sy{
flag=2;
xjsub(xmin,ymin,xmax,ymin,sx,sy,px,py);
SX=jdx;
SY=jdy;
PX=px;
PY=py;
}
}
main()
{
floatdbx[max]={10,60,50,150,170,220,240,130};/*多边形坐标*/
staticfloatf_zjx[12];/*存放第一次修改过的坐标x*/
staticfloatf_zjy[12];/*存放第一次修改过的坐标y*/
floatf_count=0;
staticfloatdby[max]={140,100,2,60,100,150,240,220};
staticfloats_zjx[12];/*存放第二次修改过的坐标x*/
staticfloats_zjy[12];/*存放第二次修改过的坐标y*/
floats_count=0;
staticfloatt_zjx[12];/*存放第三次修改过的坐标x*/
staticfloatt_zjy[12];/*存放第三次修改过的坐标y*/
floatt_count=0;
staticfloatl_zjx[12];/*存放第四次修改过的坐标x*/
staticfloatl_zjy[12];/*存放第四次修改过的坐标y*/
floatl_count=0;
floatx1,y1,x2,y2;
inti=0;
intk=0;
intgdriver=DETECT,gmode;/*屏幕初始化*/
initgraph(&gdriver,&gmode,"");
/*绘制矩形*/
setcolor(7);
rectangle(xmin,ymin,xmax,ymax);
/*绘制多边形*/
for(i=0;iline(dbx[i],dby[i],dbx[i+1],dby[i+1]);
line(dbx[i],dby[i],dbx[0],dby[0]);/*封闭多边形*/
/*用左边进行裁剪*/
for(i=0;i{
x1=dbx[i];
y1=dby[i];
x2=dbx[i+1];
y2=dby[i+1];/*为多边形起始边赋值*/
leftclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
f_zjx[f_count]=PX;
f_zjy[f_count]=PY;
f_count=f_count+1;
}
else
if(flag==1)/*s可见p不可见*/
{
f_zjx[f_count]=jdx;
f_zjy[f_count]=jdy;
f_count=f_count+1;
}
else
if(flag==2)/*p可见s不可见*/
{
f_zjx[f_count]=jdx;
f_zjy[f_count]=jdy;
f_count=f_count+1;
f_zjx[f_count]=PX;
f_zjy[f_count]=PY;
f_count=f_count+1;
}
}
/*最后一条边的处理*/
x2=dbx[0];y2=dby[0];
x1=f_zjx[f_count-1];
y1=f_zjy[f_count-1];/*为多边形起始边赋值*/
leftclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
f_zjx[f_count]=PX;
f_zjy[f_count]=PY;
}
else
if(flag==1)/*s可见p不可见*/
{
f_zjx[f_count]=jdx;
f_zjy[f_count]=jdy;
}
else
if(flag==2)/*p可见s不可见*/
{
f_zjx[f_count]=jdx;
f_zjy[f_count]=jdy;
f_count=f_count+1;
f_zjx[f_count]=PX;
f_zjy[f_count]=PY;
}
/*输出新的多边形*/
setcolor(7);
for(k=0;kline(f_zjx[k],f_zjy[k],f_zjx[k+1],f_zjy[k+1]);
line(f_zjx[f_count],f_zjy[f_count],f_zjx[0],f_zjy[0]);
/*用上边进行裁剪*/
for(i=0;i{
x1=f_zjx[i];
y1=f_zjy[i];
x2=f_zjx[i+1];
y2=f_zjy[i+1];/*为多边形起始边赋值*/
upclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
s_zjx[s_count]=PX;
s_zjy[s_count]=PY;
s_count=s_count+1;
}
else
if(flag==1)/*s可见p不可见*/
{
s_zjx[s_count]=jdx;
s_zjy[s_count]=jdy;
s_count=s_count+1;
}
else
if(flag==2)/*p可见s不可见*/
{
s_zjx[s_count]=jdx;
s_zjy[s_count]=jdy;
s_count=s_count+1;
s_zjx[s_count]=PX;
s_zjy[s_count]=PY;
s_count=s_count+1;
}
}
/*最后一条边的处理*/
x2=f_zjx[0];
y2=f_zjy[0];
x1=s_zjx[s_count-1];
y1=s_zjy[s_count-1];/*为多边形起始边赋值*/
upclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
s_zjx[s_count]=PX;
s_zjy[s_count]=PY;
}
else
if(flag==1)/*s可见p不可见*/
{
s_zjx[s_count]=jdx;
s_zjy[s_count]=jdy;
}
else
if(flag==2)/*p可见s不可见*/
{
s_zjx[s_count]=jdx;
s_zjy[s_count]=jdy;
s_count=s_count+1;
s_zjx[s_count]=PX;
s_zjy[s_count]=PY;
}
/*输出新的多边形*/
setcolor(8);
for(k=0;kline(s_zjx[k],s_zjy[k],s_zjx[k+1],s_zjy[k+1]);
line(s_zjx[s_count],s_zjy[s_count],s_zjx[0],s_zjy[0]);/*连接最后一条边*/
/*用右边进行裁剪*/
for(i=0;i{
x1=s_zjx[i];
y1=s_zjy[i];
x2=s_zjx[i+1];
y2=s_zjy[i+1];/*为多边形起始边赋值*/
rightclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
t_zjx[t_count]=PX;
t_zjy[t_count]=PY;
t_count=t_count+1;
}
else
if(flag==1)/*s可见p不可见*/
{
t_zjx[t_count]=jdx;
t_zjy[t_count]=jdy;
t_count=t_count+1;
}
else
if(flag==2)/*p可见s不可见*/
{
t_zjx[t_count]=jdx;
t_zjy[t_count]=jdy;
t_count=t_count+1;
t_zjx[t_count]=PX;
t_zjy[t_count]=PY;
t_count=t_count+1;
}
}
/*最后一条边的处理*/
x2=s_zjx[0];
y2=s_zjy[0];
x1=t_zjx[t_count-1];
y1=t_zjy[t_count-1];/*为多边形起始边赋值*/
rightclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
t_zjx[t_count]=PX;
t_zjy[t_count]=PY;
}
else
if(flag==1)/*s可见p不可见*/
{
t_zjx[t_count]=jdx;
t_zjy[t_count]=jdy;
}
else
if(flag==2)/*p可见s不可见*/
{
t_zjx[t_count]=jdx;
t_zjy[t_count]=jdy;
t_count=t_count+1;
t_zjx[t_count]=PX;
t_zjy[t_count]=PY;
}
/*输出新的多边形*/
setcolor(9);
for(k=0;kline(t_zjx[k],t_zjy[k],t_zjx[k+1],t_zjy[k+1]);
line(t_zjx[t_count],t_zjy[t_count],t_zjx[0],t_zjy[0]);/*连接最后一条边*/
/*用下边进行裁剪*/
for(i=0;i{
x1=t_zjx[i];
y1=t_zjy[i];
x2=t_zjx[i+1];
y2=t_zjy[i+1];/*为多边形起始边赋值*/
bottomclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
l_zjx[l_count]=PX;
l_zjy[l_count]=PY;
l_count=l_count+1;
}
else
if(flag==1)/*s可见p不可见*/
{
l_zjx[l_count]=jdx;
l_zjy[l_count]=jdy;
l_count=l_count+1;
}
else
if(flag==2)/*p可见s不可见*/
{
l_zjx[l_count]=jdx;
l_zjy[l_count]=jdy;
l_count=l_count+1;
l_zjx[l_count]=PX;
l_zjy[l_count]=PY;
l_count=l_count+1;
}
}
/*最后一条边的处理*/
x2=t_zjx[0];
y2=t_zjy[0];
x1=l_zjx[l_count-1];
y1=l_zjy[l_count-1];/*为多边形起始边赋值*/
bottomclip(x1,y1,x2,y2);
if(flag==3)/*都可见*/
{
l_zjx[l_count]=PX;
l_zjy[l_count]=PY;
}
else
if(flag==1)/*s可见p不可见*/
{
l_zjx[l_count]=jdx;
l_zjy[l_count]=jdy;
}
else
if(flag==2)/*p可见s不可见*/
{
l_zjx[l_count]=jdx;
l_zjy[l_count]=jdy;
l_count=l_count+1;
l_zjx[l_count]=PX;
l_zjy[l_count]=PY;
}
/*输出新的多边形*/
setcolor(10);
for(k=0;kline(l_zjx[k],l_zjy[k],l_zjx[k+1],l_zjy[k+1]);
line(l_zjx[l_count],l_zjy[l_count],l_zjx[0],l_zjy[0]);/*连接最后一条边*/
}
}
三、原始多边形如图所示:
裁剪后的多边形如图所示: