线段裁剪二:梁友栋Barsky算法

梁友栋-Barsky裁剪算法

  CyrusBeck用参数化方法提出了比Cohen-Sutherland更有效的算法。后来梁友栋和Barsky独立地提出了更快的参数化线段裁剪算法,也称为Liany-BarskyLB)算法。

一、梁友栋-Barsky裁剪算法思想:

  我们知道,一条两端点为P1x1y1)、P2x2y2)的线段可以用参数方程形式表示:

 

x= x1+ u·x2-x1= x1+ u·Δx
y= y1+ u
·y2-y1= y1+ u·Δy 

0≤u≤1

1

  式中,Δx=x2-x1Δy=y2-y1,参数u01之间取值,Pxy)代表了该线段上的一个点,其值由参数u确定,由公式可知,当u=0时,该点为P1x1y1),当u=1时,该点为P2x2y2)。如果点Pxy)位于由坐标(xminymin)和(xmaxymax)所确定的窗口内,那么下式成立:

 

xmin≤x1+ u·Δx≤xmax
ymin≤y1+ u
·Δy≤ymax

(2

  这四个不等式可以表示为:

u·pk ≤qk k=1234

(3

  其中,pq定义为:

 

p1=-Δx q1=x1-xmin
p2=
Δx
q2=xmax-x1
p3=-
Δy
q3=y1-ymin
p4=
Δy q4=ymax-y1

4

  从(4)式可以知道:任何平行于窗口某边界的直线,其pk=0k值对应于相应的边界(k=1234对应于左、右、下、上边界)。如果还满足qk<0,则线段完全在边界外,应舍弃该线段。如果pk=0并且qk≥0,则线段平行于窗口某边界并在窗口内,见图中所示。公式(4)式还告诉我们:

  1、当pk<0时,线段从裁剪边界延长线的外部延伸到内部;

  2、当pk>0时,线段从裁剪边界延长线的内部延伸到外部;

例如,当Δx≥0时,对于左边界p1<0p1=-Δx),线段从左边界的外部到内部;

           对于右边界p2>0p2=Δx),线段从右边界的内部到外部。

     当Δy<0时,对于下边界p3>0p3=-Δy),线段从下边界的内部到外部;

          对于上边界p4<0p4=Δy),线段从上边界的外部到内部。

     当pK≠0时,可以计算出参数u的值,它对应于无限延伸的直线与延伸的窗口边界k的交点,即:

u = qk/pk

5

  对于每条直线,可以计算出参数u1u2,该值定义了位于窗口内的线段部分:

  1u1的值由线段从外到内遇到的矩形边界所决定(pk<0),对这些边界计算rk=qk/pku10和各个r值之中的最大值。

  2u2的值由线段从内到外遇到的矩形边界所决定(pk>0),对这些边界计算rk=qk/pku20和各个r值之中的最小值。

  3、如果u1>u2,则线段完全落在裁剪窗口之外,应当被舍弃;否则,被裁剪线段的端点可以由u1u2计算出来。

二、梁友栋-Barsky裁剪算法实现:

  1、初始化线段交点的参数:u1=0u2=1

  2、计算出各个裁剪边界的pq值;

  3根据pq来判断:是舍弃线段还是改变交点的参数。

   (1 p<0时,参数r用于更新u1
     (u1=max{u1rk}

   (2 p>0时,参数r用于更新u2
     (u2=min{u2rk}

   (3)如果更新了u1u2后,使u1>u2,则舍弃该线段。

   (4)当p=0q<0时,因为线段平行于边界并且位于边界之外,则舍弃该线段。见下图所示。

 4pq的四个值经判断后,如果该线段未被舍弃,则裁剪线段的端点坐标由参数u1u2的值决定。

三、算法代码

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值