Sutherland-Hodgeman多边形裁剪

 Sutherland-Hodgeman多边形裁剪

  Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(IE.Sutherland)和霍德曼(Hodgman)在1974年提出的。这种算法采用了分割处理、逐边裁剪的方法。

  一、Sutherland-Hodgeman多边形裁剪算法思想:

  每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,适时地插入新的顶点:即交点和窗口顶点,从而得到一个新的多边形顶点序列。

  然后以此新的顶点序列作为输入,相对第二条窗边界线进行裁剪,又得到一个更新的多边形顶点序列。

  依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边形顶点序列即为所求的裁剪好了的多边形。如下图所示。

  新的多边形顶点序列产生规则:

  在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分成两个部分:一部分称为边界内侧;另一部分称为边界外侧。

  如下图所示,依序考虑多边形的各条边。假设当前处理的多边形的边为SP(箭头表示顺序关系,S为前一点,P为当前点),边SP与裁剪线的位置关系只有下面四种情况:

  1、S在外侧,P在内侧。则交点Q、当前点P保存到新多边形中。
  2、SP均在内侧,则当前点P保存到新多边形中。
  3、S在内侧,P在外侧。则交点Q保存到新多边形中。
  4、SP均在外侧。则没有点被保存到新多边形中。

  二、Sutherland-Hodgeman多边形裁剪算法实现:

  1、已知:多边形顶点数组p[ ][2],顶点个数n,
       裁剪边界xmin(假设对左边界进行裁剪),
       定义新多边形顶点数组q[][2]。

  2、赋初值:被裁多边形顶点数组的下标变量i=0;
        新多边形顶点数组的下标变量j=-1;
        前一个点S的x方向分量s[0]=p[n-1][0];
            S的y方向分量s[1]=p[n-1][1];
        前一个点S的内外标志,用变量flag来标识:
          0表示在内侧,1表示在外侧。
          if(s在边界内侧) /*例如对左边界:s[0]>=xmin*/
           flag=0;
          else
           flag=1;

  3、对多边形的n条边进行处理,对当前点号的考虑为:0~n-1。
   for(i=0;i<n;i++)
   {
    if(当前第i个顶点是否在边界内侧?) /*对左边界:p[i][0]>=xmin */
    {
     if(flag!=0) /*前一个点在外侧吗?*/
     {
      flag=0;/*从外到内的情况,将标志置0,作为下一次循环的前一点标志*/
      j++;
      q[j][0]=求出交点的x方向分量; /*将交点q放入新多边形*/ 
      q[j][1]=求出交点的y方向分量;
     }
     j++; 
     q[j][0]= p[i][0]; /*将当前点pi放入新多边形*/ 
     q[j][1]= p[i][1];
    }
    else
    {
     if(flag==0) /*前一个点在内侧吗?*/
     {
      flag=1;/*从内到外的情况,将标志置1,作为下一次循环的前一点标志*/
      j++;
      q[j][0]=求出交点的x方向分量; /*将交点q放入新多边形*/
      q[j][1]=求出交点的y方向分量;
     }
    }
    s[0]=p[i][0]; /*将当前点作为下次循环的前一点*/
    s[1]=p[i][1];
   }


 四、点在边界内侧的判断方法:

  为了判断pi点是否在边界内侧可用坐标比较法和更通用的向量叉积符号判别法。

  1、坐标比较法

  将点的某个方向分量与边界进行比较。

  例如,判断某点是否在下边界内侧,用条件判别式: if(p[i][1]>=ymin) 即可。

  对其它边界也一样。但不能写成通用公式。 

  2、向量叉积法

  为简单计,测试点表示为P点。假设窗口边界方向为顺时针,如图中所示,对于其中任一边界向量,从向量起点A向终点B看过去:

  如果被测试点P在该边界线右边(即内侧),AB×AP的方向与X-Y平面垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。

  反过来,如果P在该边界线的左边(即外侧),这时AB×AP的方向与X-Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。

  设:点P(x,y)、点A(xA,yA)、点B(xB,yB),
    向量AB={(xB-xA),(yB-yA)},
    向量AP={(x-xA),(y-yA)},

  那么AB×AP的方向可由下式的符号来确定:

V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA)(3-14)

  因此,当V≤0时,P在边界线内侧;

     而V>0时,P在边界线外侧。

  五、Sutherland-Hodgeman多边形裁剪算法特点:

  Sutherland-Hodgeman多边形裁剪算法具有一般性,被裁剪多边形可以是任意凸多边形或凹多边形,裁剪窗口不局限于矩形,可以是任意凸多边形。
  上面的算法是多边形相对窗口的一条边界进行裁剪的实现,对于窗口的每一条边界依次调用该算法程序,并将前一次裁剪的结果多边形作为下一次裁剪时的被裁剪多边形,即可得到完整的多边形裁剪程序。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值