Cohen-Sutherland裁剪算法+中点分割直线段裁剪算法
Cohen-Sutherland裁剪算法
编码规则
Cohen-Sutherland算法又叫编码裁剪算法,主要将界面分为9个编码区
4位二进制编码D3 D2 D1 D0
x < xwl ? D0 = 1 : D0 = 0
x > xwr ? D1 = 1 : D0 = 0
y > ywb ? D2 = 1 : D0 = 0
y < ywt ? D3 = 1 : D0 = 0
(三目运算符)
总结一下就是 : 裁剪窗口内编码为0,外为1 。只要有1,必在裁剪窗口外。
具体步骤
我们对线段的两个端点P1,P2进行编码。设其为code1
和code2
。线段与窗口的位置分为以下三种情况:
1.code1 | code2 = 0(按位或 为0)
表示 code1 = code2 = 0
,说明两个端点都在窗口内,此时可以取整条线段。
2.code1 & code2 != 0 (按位与 不为0)
表示code1 和 code2 至少某一位同为1,两个端点在窗口外的同一侧
,说明这时整条线段不在裁剪框内,丢弃。
3.若以上两种都不成立,则需求直线段与窗口边界的交点。在交点处把线段“切开”:若P1在窗口外,先从低位检测编码code1,编号为1的编码位确定线段与边界的交点,并令其代替P1(编码只含一个1时可这样简单口头判定,编码还是需要交点公式)。若P1在窗口内,则检测P2。
如图所示,P1编码为 1001 ,但因为从低位开始检测,所以判断P1与xwl相交(D0 = 1),求出交点P1‘(已知俩个端点可以求出直线段的斜率K = (y2-y1)/(x2-x1),由y=y1+k(x-x1)可以推出与边界的交点)
此时P1’已经在窗口内,所以转求P2。P2的编码为 0100,所以求出P2与窗口的交点在ywb上(D2 = 1),求出P2‘。之后,再判断P1’P2‘编码按位或为零,得到裁剪后的线段。
算法评价
创新提出直线段端点编码规则,可用编码方法快速判断完全可见和显然不可见线段。但需要计算直线段与窗口边界的交点,最坏情形线段需求交四次。
适用场合:大窗口场合(大多数对象都在窗口中);窗口特别小的场合(如光标拾取图形时,光标看作小的裁剪窗口。)
中点分割直线段裁剪算法
在C-S算法基础上,该算法对第三种情况进行优化,不用求交点,只用到加法与移位,利于硬件实现。
记线段P1P2的中点为P,得到两条线段P1P和P2P,看他们是否符合第一第二种情况,若不符合则继续均分直到符合为止。
算法评价
避免求解直线段与窗口交点,只需计算直线段中点坐标就可以完成直线段的裁剪,但迭代计算工作量较大。
主要计算过程只用到加法和除2运算,适合硬件实现。
C-S裁剪算法与中点分割算法在区码测试阶段能以位运算方式高效率地进行,当大多数线段能够简单地取舍时,效率较好。
参考书
《计算机图形学基础教程》孔令德