polygon clipping之Sutherland-Hodgman Algorithm

来源:互联网 发布:华杉讲透 孙子兵法知乎 编辑:程序博客网 时间:2024/06/03 09:07

Sutherland-Hodgman算法

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

一,基本思想:

         一次用窗口的一条边裁剪多边形。

        考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧。多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种

情况(1)仅输出1个顶点P;

情况(2)输出0个顶点;

情况(3)输出线段SP与裁剪线的1个交点I;

情况(4)输出线段SP与裁剪线的1个交点I和1个终点P

二、算法实现:

  1、已知:多边形顶点数组src,顶点个数n,
       定义新多边形顶点数组dest

  2、赋初值:用变量flag来标识:
          0表示在内侧,1表示在外侧。

 3、对多边形的n条边进行处理,对当前点号的考虑为:0~n-1。
   for(i=0;i<n;i++)
   {
    if(当前第i个顶点是否在边界内侧?)

  {
     if(flag!=0) /*前一个点在外侧吗?*/
     {
      flag=0;/*从外到内的情况,将标志置0,作为下一次循环的前一点标志*/
      (dest + j) =求出交点; /*将交点dest放入新多边形*/

j++
}
     
     (dest + j)= (src + i); /*将当前点srci放入新多边形*/

j++
}
    else
    {
     if(flag==0) /*前一个点在内侧吗?*/
     {
      flag=1;/*从内到外的情况,将标志置1,作为下一次循环的前一点标志*/
      (dest + j) =求出交点; /*将交点dest放入新多边形*/

j++
}
    }
    s= (src + i); /*将当前点作为下次循环的前一点*/
   }

三,算法特点:

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



0 0