多边形逐次裁剪.docx
- 文档编号:3453536
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:27
- 大小:67.72KB
多边形逐次裁剪.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(sx { 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(sy { flag=1; xjsub(xmin,ymax,xmax,ymax,sx,sy,px,py); SX=jdx; SY=jdy;/*PX=px;PY=py;*/ } else if(py { 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(sx { flag=1; xjsub(sx,sy,px,py,xmax,ymin,xmax,ymax); SX=jdx; SY=jdy;/*PX=px;PY=py;*/ } else if (px { 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;i line(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;k line(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;k line(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;k line(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;k line(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]);/*连接最后一条边*/ } } 三、原始多边形如图所示: 裁剪后的多边形如图所示:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多边形 逐次 裁剪