首页 > 编程语言 > 详细

CGA裁剪算法之Liang-Barsky二维裁剪算法

时间:2015-12-25 21:01:44      阅读:743      评论:0      收藏:0      [点我收藏+]

CGA裁剪算法之Liang-Barsky二维裁剪算法

  本质上看,Liang-Barsky二维裁剪算法,是一种特殊形式的Cyrus-Beck算法。同属于参数裁剪算法。

  Liang-Barsky算法适用于任意的凸二维和三维裁剪区域,单通常只讨论与坐标轴平行的矩形裁剪区域,即规则的方正的裁剪区域。

  技术分享

  如上图:

  P1(X1, Y1), P2(X2, Y2) 分别是线段的两个端点。

  Xl,Xr,Yb,Yu分别代表裁剪窗口的 左, 右, 下, 上边界。

  则线段的方程可以表示为: P(t)= P1 + (P2-P1)*t, 其中,0<=t <=1,是参数t的范围。

1. liang-basky算法原理

(1)两个不等式:

  Xl <= X(t) <= Xr;    Yd <= Y(t) <= Yu; 

(2)在X,Y两个方向分量等式

  X(t) = X1 + (X2 - X1)*t;   0<=t <=1,

  Y(t) = Y1 + (Y2 - Y1)*t;   0<=t <=1,

  令:Dx = (X2 - X1), Dy = (Y2 - Y1)

  下面仅以Y方向为例做推导,X分量原理相同:

(3)推导

  Y分量等式带入Y分量不等式:  

  -Dy*t >= Y1 - Yb;

  Dy*t <= Yu - Y1.

  因为在裁剪窗口边界,分别把平面空间相对划分成两个区域:【1】裁剪空间内部 ,【2】裁剪空间外部。以Yu为例,在Yu之上是裁剪平面外部,在Yu下是裁剪空间内。利用这样的不等式可以确定线段与裁剪空间的位置关系。

  即:

  Y1 - Yb < 0   则 P1在 Yb的下部(不在相应边裁剪空间内);

  Yu - Y1 < 0   则 P1在Yu的上部(不在相应边裁剪空间内);同理Xr 与Xl的位置关系。

  这也可以认为是编码裁剪算法的另一种区域划分办法。

  则 “等式右边” >= 0 则可以视为相应的裁剪边界的内部或者边界上。

  特殊情况:

  【1】 如果 “等式右边”  = 0 , 则则说明当前线段在当前边界上, 如果 Dy = 0 则说明在线段与当前边界平行。

  【2】 如果Dy=0,且 “等式右边” < 0则说明,则说明,线段与边界平行,且在裁剪空间外部, 抛弃。

  如果线段与裁剪线有"交点",把不等式可以写成: dt = q;

  则 t = q/ d

  如果线段与边界不平行,在参数定义域: 0 <= t <= 1 则线段P1P2与裁剪边界有交点,其交点不一定2个。

  可以通过将参数值分为上限组,和下限组分别求取参数的最大值tu,与最小值tl即可获取正确的交点参数值。

  【3】上下线划分依据:

  q >= 0 且 d < 0 则说明在Y分量下边界线处理,需要寻找此情况下的t的最大上限,且排除 t > tu 的t值。

  q >= 0 且 d > 0 则说明在Y分量上边界线处理,需要寻找此情况下的t的最小下线,且排除 t < tl 的t值。

(4)分别每条边做如上处理,即可获得参数t的交点参数值。

2. 程序如下

 

CGA裁剪算法之Liang-Barsky二维裁剪算法

原文:http://www.cnblogs.com/icmzn/p/5076838.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!