多边形逐次裁剪.docx

上传人:b****1 文档编号:3453536 上传时间:2023-05-05 格式:DOCX 页数:27 大小:67.72KB
下载 相关 举报
多边形逐次裁剪.docx_第1页
第1页 / 共27页
多边形逐次裁剪.docx_第2页
第2页 / 共27页
多边形逐次裁剪.docx_第3页
第3页 / 共27页
多边形逐次裁剪.docx_第4页
第4页 / 共27页
多边形逐次裁剪.docx_第5页
第5页 / 共27页
多边形逐次裁剪.docx_第6页
第6页 / 共27页
多边形逐次裁剪.docx_第7页
第7页 / 共27页
多边形逐次裁剪.docx_第8页
第8页 / 共27页
多边形逐次裁剪.docx_第9页
第9页 / 共27页
多边形逐次裁剪.docx_第10页
第10页 / 共27页
多边形逐次裁剪.docx_第11页
第11页 / 共27页
多边形逐次裁剪.docx_第12页
第12页 / 共27页
多边形逐次裁剪.docx_第13页
第13页 / 共27页
多边形逐次裁剪.docx_第14页
第14页 / 共27页
多边形逐次裁剪.docx_第15页
第15页 / 共27页
多边形逐次裁剪.docx_第16页
第16页 / 共27页
多边形逐次裁剪.docx_第17页
第17页 / 共27页
多边形逐次裁剪.docx_第18页
第18页 / 共27页
多边形逐次裁剪.docx_第19页
第19页 / 共27页
多边形逐次裁剪.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

多边形逐次裁剪.docx

《多边形逐次裁剪.docx》由会员分享,可在线阅读,更多相关《多边形逐次裁剪.docx(27页珍藏版)》请在冰点文库上搜索。

多边形逐次裁剪.docx

多边形逐次裁剪

 

计算机图形学作业:

多边形逐次裁剪

 

姓名:

 

学号:

 

专业:

 

时间:

 

一、主程序流程图

用矩形右边裁剪多边形

输出裁剪后的多边形的

各个顶点坐标到指定的

数组

初始化多边形坐标参

数,利用函数绘制多边形

画出裁剪后的多边形

用矩形左边裁剪多边形

用矩形下边裁剪多边形

输出裁剪后的多边形的

各个顶点坐标到指定的数组输出裁剪后的多边形的各

个顶点坐标到指定的数组

画出裁剪后的多边形

画出裁剪后的多边形

用矩形上边裁剪多边形

输出裁剪后的多边形的

各个顶点坐标到指定的

数组

 

画出裁剪后的多边形

线段的裁剪方框图

取线段初始点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;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]);/*连接最后一条边*/

}

}

三、原始多边形如图所示:

 

裁剪后的多边形如图所示:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2