Cohen-Sutherland线段裁剪算法

Cohen-Sutherland线段裁剪算法学习与详解

【二维线裁剪】

线裁剪算法通过一系列的测试求交计算来判断是否整条线段或其中的某部分可以保存下来。线段与窗口边界的交点计算时线裁剪函数的耗时部分。因此,减少交点计算是任一线裁剪算法的主要目标。

为此,裁剪前我们先进行测试,确定线段是否完整的在裁剪窗口内部或外部。确定一线段完整的在窗口内部很容易,而确定一线段完整低在窗口外部就比较困难。

若无法确定一线段是否完整的在窗口内部或外部,则必须通过交点计算来确定是否线段有一部分落在窗口内部。

【Cohen-Sutherland算法介绍】

Cohen-Sutherland线段裁剪算法是一个已经得到广泛应用的快速线段裁剪算法。该算法通过初始测试来减少交点计算,从而减少线段裁剪算法所用的时间。

算法为每条线段的端点都赋以称为区域码的四位二进制码,每一位用于标识端点相对于相应裁剪窗口边界的里面还是外面。

下面给出四位二进制码的示意图,一般情况下从左到右依次编号4321,分别对应裁剪窗口的上、下、右、左(注意不是上下左右)。

裁剪窗口的每一条边界将二维空间划分成窗口内部和外部两个空间。四个窗口边界(边界所在直线)将平面划分成了九个区域,如下图所示。

在九个不同区域中的端点会被赋予不同的区域码,如在裁剪窗口左下角的区域的端点被赋予的区域码是0101,而在裁剪窗口内部的端点的区域码是0000。

区域码的位值通过将端点坐标值(x,y)与裁剪窗口边界相比较而确定。若x

除了使用不等式测试,我们还可以使用位处理操作和下列两步操作更高效地确定区域码的值:

(1)计算端点坐标与裁剪边的差。

(2)用各差值计算的符号位来设置区域码中相应的值。

按上述二进制码示意图的顺序,位1设为x-xwmin的符号位;位2设为xwmin-x的符号位;位3设位y-ywmin的符号位;位4设为ywmin-y的符号位。

【Cohen-Sutherland算法描述】

一旦给所有的线段端点建立了区域码,就可以快速判断哪条线段完全在裁剪窗口之内,哪条线段完全在窗口之外。

①线段完全在窗口之内:线段的两个端点的区域码均为0000,保留这样的线段。

②线段完全在窗口之外:线段的两个端点的区域码中有一对相同的位置都为1,丢弃这样的线段。

例如:线段的一个端点的区域码为1001,而另一个端点的区域码为0101,则丢弃这条线段,因为这条线段的两个端点都在裁剪矩形的左边,端点区域码的第一位都为1。

程序中对线段在窗口内部还是外部的判断是对两个端点的区域码进行逻辑或操作。如果操作结果为0000,则线段完全位于裁剪窗口之内,保留此线段并测试下一条线段。若两个端点的区域码进行逻辑与操作结果为真(不是0000),则表明线段完全位于窗口之外,丢弃此线段。

③对于不能判断为完全在窗口外或窗口内的线段,则要测试其与窗口边界的交点。

这些线段可能穿过或不穿过窗口内部。因此可能要进行多次求交运算才可完成一条线段的裁剪,求交次数依赖于选择裁剪边界的次序。每次处理一条裁剪窗口边界之后,裁剪掉其中的一部分,余下的部分对照窗口的其他边界进行检查。该过程一直进行到线段完全被裁剪掉或余下的线段部分完全在裁剪窗口内。

下面我们讨论下图的两条不能立刻判断出在窗口内/外的线段。假定窗口边界处理次序为左、右、下、上,要检查一条线段是否与某裁剪边界相交,可以检查其两端点区域码的相应位,若其中一个是1一个是0,则线段与该边界相交。

如上图示,P1P2和P3P4是两条不能马上判断出在窗口内还是窗口外的线段。先对P1P2进行处理:

1、左边界处理:

P1到P2线段的区域码是0100和1001。因此P1在左边界之内,P2在左边界之外。

下来计算交点位置P2’,并裁剪点P2到P2’的部分。

2、右边界处理:

余下线段位于右边界内部,无需处理。

3、下边界处理:

P1在下边界之下;而P2’在下边界之上,因此求出在该边界上的交点P1’,并清楚P1到P1’的部分。

4、上边界处理:

确定上边界交点位置P2’’,裁剪掉上边界之上的部分并保存P1’到P2’'的内部段。

再对P3P4进行处理:

对于线段P3P4,P3在左边界的外部,而P4在左边界内部。因此计算交点P3’并清除P3到P3’的线段。

通过对端点P3’和P4区域码的测试,可得余下的线段都在裁剪窗口之下,所以将其清除。


参考文献:
1.《计算机图形学:第三版》 蔡士杰等译 电子工业出版社 2010.7

你可能感兴趣的:(计算机图形学,线段裁剪算法)