多边形裁剪的Sutherland—Hodgman算法(计算机图形学)_第1页
多边形裁剪的Sutherland—Hodgman算法(计算机图形学)_第2页
多边形裁剪的Sutherland—Hodgman算法(计算机图形学)_第3页
多边形裁剪的Sutherland—Hodgman算法(计算机图形学)_第4页
多边形裁剪的Sutherland—Hodgman算法(计算机图形学)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多边形裁剪的SutherlandHodgman算法 1>. SutherlandHodgman多边形裁剪算法思想该算法的基本思想是每次用窗口的一条边界及其延长线来裁剪多边形的各边。多边形通常由它的顶点序列来表示,经过裁剪规则针对某条边界裁剪后,结果形成新的顶点序列,又留待下条边界进行裁剪,直到窗口的所有边界都裁剪完毕,算法形成最后的顶点序列,才是结果多边形(它可能构成一个或多个多边形)。当多边形一个顶点Pi相对于窗口某条边界及其延长线进行剪裁时,不外乎下列四种情况(即裁剪规则):1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列;2、顶点Pi在内侧,前一顶点Pi-1在

2、外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列;3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点序列;4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。 2>. SutherlandHodgman多边形裁剪算法步骤考虑多边形相对于一条边界及其延长线进行裁剪的算法:1从主函数得到待裁剪多边形的顶点序列P2、顶点序列数n、窗口一条边界参数xl(假如为矩形窗口的左边界);2赋初值:将顶点序列中的最后一个顶点赋给前一顶点S;设置初始标志flag:if(S在边界内侧)flag=0;else flag=1;设新的顶点序列数j=0;3对多边形各顶点进

3、行裁剪规则处理,结果放入新的多边形顶点序列Q2中:for(对第一个顶点直到最后一个顶点,逐一处理)if(Pi在边界内侧)if(flag!=0)flag=0;求交点并放入新的多边形顶点序列Qj中;j+;将当前顶点放入新的多边形顶点序列Qj中:Qj=Pi;j+;elseif(flag=0)flag=1;求交点并放入新的多边形顶点序列Qj中;j+;将当前顶点赋给S:S=Pi;4做返回准备:将新的多边形顶点序列Q又逐一放回原多边形顶点序列P中:P=Q;将新的多边形顶点数j放回原多边形顶点数n中:n=j;/-多边形裁剪的SutherlandHodgman算法-/void CMyClip_AView:Cl

4、ipedgeL(CPoint polypoint, CPoint clipwindow, UINT polynum)/*其中参数polypoint为多边形顶点,clipwindow为裁剪窗口顶点,polynum为多边形顶点数目*/            /找出裁剪窗口边界        long xl,xr,yt,yb;        UINT i

5、;        xl=clipwindow0.x;        xr=clipwindow0.x;         yt=clipwindow0.y;        yb=clipwindow0.y;         for(

6、i=1;i<=4;i+)                     if(xl>clipwindowi.x)                 xl=clipwindowi.x;     &#

7、160;      if(xr<clipwindowi.x)                 xr=clipwindowi.x;             if(yb>clipwindowi.y)     &#

8、160;          yb=clipwindowi.y;            if(yt<clipwindowi.y)                 yt=clipwindowi.y;   &#

9、160;            /        CPoint BPolygon_Num,CPolygon_Num;        UINT m_nA,m_nB;            int x,y;   &

10、#160;    long tem1,tem2;            m_nA=polynum;/*记载原始多边形顶点顶点个数*/        m_nB=0;/*记载新生成多边形顶点顶点个数*/        for(i=0;i<m_nA;i+)     &#

11、160;              if(polypointi.x<xl && polypointi+1.x<xl) /*判断的多边形边两个端点都在外部,不做处理*/                        

12、0;   continue;/*如果是这种情况,那么就对继续对下一条多边形边作判断,也就是说下面的判断不用做了*/                        if(polypointi.x>=xl && polypointi+1.x>=xl) /*边两个端点都在内部,保留*/    &#

13、160;           /*因为每个保留的点在数组中只出现一次,且下一次判断时第二个端点一定会要取到,因此只保留的两个点中的第一个*/                            Bm_nB.x =polypointi.x

14、;                Bm_nB.y =polypointi.y ;                m_nB=m_nB+1;            continue; 

15、                       if(polypointi.x<xl && polypointi+1.x>=xl)/*边两个端点起点在外部,终点在内部,求交点,然后交点,终点都应该送入临时数组*/             

16、60;              /*保留交点*/                x=xl;                tem1=(xl-polypointi.x);

17、                /tem2=(xl-x1)*dy/dx+y1;                /y/x=dy/dx->y=x*dy/dx            

18、;    tem2=tem1*(polypointi+1.y-polypointi.y)/(polypointi+1.x-polypointi.x)+polypointi.y;                y=tem2;                Bm_nB.x

19、=x;                Bm_nB.y =y;                m_nB=m_nB+1;            continue;  

20、0;                     if(polypointi.x>=xl && polypointi+1.x<xl)/*起点在内部,终点在外,求交点,然后起点,交点送入临时数组*/                

21、0;  /*保留内部点*/                Bm_nB.x =polypointi.x ;                Bm_nB.y =polypointi.y ;         

22、       m_nB=m_nB+1;                /*保留交点*/                x=xl;         &#

23、160;      tem1=(xl-polypointi.x);                tem2=tem1*(polypointi+1.y-polypointi.y)/(polypointi+1.x-polypointi.x)+polypointi.y;           &#

24、160;    y=tem2;                Bm_nB.x =x;                Bm_nB.y =y;           

25、     m_nB=m_nB+1;            continue;                            /把第一个点的数据拷贝到最后   &#

26、160;    /形成裁剪后的多边形        if(i=m_nA)                    Bm_nB=B0;                /下- 

27、       m_nA=0;        for(i=0;i<m_nB;i+)                    if(Bi.y<yb && Bi+1.y<yb)       &#

28、160;        /两个点全在下方                            continue;/下一条边             

29、                   if(Bi.y>=yb && Bi+1.y>=yb)                /p1,p2都在yb上方        

30、                        Cm_nA.x =Bi.x;                Cm_nA.y =Bi.y;        

31、;        m_nA+;            continue;                              

32、;  if(Bi.y<yb && Bi+1.y>=yb)            /p1在下,P2在上,留交点,外内                            y=yb; 

33、               tem1=yb-Bi.y;                /tem2=x1+(yb-y1)*dx/dy               

34、; tem2=tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y) + Bi.x;                x=tem2;                Cm_nA.x =x;         

35、;       Cm_nA.y =y;                m_nA+;            continue;              

36、;          if(Bi.y>=yb && Bi+1.y<yb)            /p1在上方,P2在下方,留P1和交点,内外                    &

37、#160;       /save p1                Cm_nA.x=Bi.x;                Cm_nA.y=Bi.y;       

38、         m_nA+;                /留交点                y=yb;         

39、       tem1=yb-Bi.y;                /tem2=x1+(yb-y1)*dx/dy                tem2=tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y)+Bi.x;

40、60;               x=tem2;                Cm_nA.x =x;                Cm_nA.y =y;&

41、#160;               m_nA+;            continue;                       

42、     /形成第二次裁剪多边形        if(i=m_nB)                    Cm_nA=C0;                /右-

43、60;       m_nB=0;        for(i=0;i<m_nA;i+)                    if(Ci.x>xr && Ci+1.x>xr)       

44、;     /P1,P2都在右方-go next                             continue;               

45、60;        if(Ci.x<=xr && Ci+1.x<=xr)            /P1,P2都在左方,留P1                       

46、     Bm_nB.x =Ci.x;                Bm_nB.y =Ci.y;                m_nB+;          

47、;  continue;                        if(Ci.x>xr && Ci+1.x<=xr)            /P1在右方,P2在左方,留交点    

48、60;                       x=xr;                tem1=Ci.x-xr;          

49、      tem2=Ci.y-tem1*(Ci+1.y-Ci.y)/(Ci+1.x-Ci.x);                y=tem2;                Bm_nB.x =x;    &#

50、160;           Bm_nB.y =y;                m_nB+;            continue;        

51、60;               if(Ci.x<=xr && Ci+1.x>xr)            /P1在内,P2在外,留P1和交点                

52、60;           /save p1                Bm_nB.x =Ci.x;                Bm_nB.y =Ci.y;   

53、             m_nB+;                /save 交点                x=xr;    &#

54、160;           tem1=Ci.x-xr;                tem2=Ci.y-tem1*(Ci+1.y-Ci.y)/(Ci+1.x-Ci.x);              

55、0; y=tem2;                Bm_nB.x =x;                Bm_nB.y =y;              &#

56、160; m_nB+;            continue;                            /三次裁剪后的新多边形        if(i=m

57、_nA)                    Bm_nB=B0;                /上-        m_nA=0;      &#

58、160; for(i=0;i<m_nB;i+)                    if(Bi.y>yt && Bi+1.y>yt)            /p1,p2都在上方,next       &#

59、160;                    continue;                        if(Bi.y<=yt && Bi+1.y<=yt)

60、60;           /p1,p2都在下方,留P1                            Cm_nA.x =Bi.x;        &#

61、160;       Cm_nA.y =Bi.y;                m_nA+;            continue;             

62、;           if(Bi.y>yt && Bi+1.y<=yt)            /P1在上方,P2在下方外内,留交点                    

63、;        y=yt;                tem1=Bi.y-yt;                /tem2=x1+(yb-y1)*dx/dy     

64、0;          tem2=Bi.x-tem1*(Bi+1.x-Bi.x)/(Bi+1.y-Bi.y);                x=tem2;                Cm_nA.x =x;

65、                Cm_nA.y =y;                m_nA+;            continue;    &

66、#160;                   if(Bi.y<=yt && Bi+1.y>yt)            /P1在下方,P2在上方,内外,留P1和交点                            /save p1,                Cm_nA.x =Bi.x;        

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论