裁剪算法

Cohen-Sutherland算法(编码裁剪算法)

一、基本思想

采用编码的方式对直线段分三种情况处理

(3)重点在于2种情况都不满足的时候,需要按交点来进行分段,然后再判定。

二、编码规则

(1)以上三种情况都采用编码的方式来快速解决。

每条线段的端点偶读赋以四位二进制码D3D2D1D0,编码规则如下:

左右下上,即边界之外为1,否则为0。

(2)

三、具体实现

裁剪出一条线段,先求出端点编码code1和code2,然后进行“或” 和“与” 运算。

或0取,与非弃。

(3)若以上2种情况都不满足,例如:

此时将p1和p2的编码进行与或操作发现,或不为0,与为0。则采用分段的方法。按左右下上的顺序求出交点P3,P1P3在窗外则舍弃。

得到p3p2时,再对p3p2进行编码测试,发现也属于第三种情况。则再求出交点p4。经测试,p3p4可取,p4p2舍弃。

四、额外说明

(1)虚交点:对于舍弃的情况还有一种特例,如下图中的蓝线。

此时AB点进行编码测试也属于第三种情况,但是却需要舍弃。这就需要计算出虚交点,然后分段舍弃了AC和CB。

(2)交点的计算方法

因为通常都是已经边界坐标,所以都是利用斜率来按照左下右上的顺序计算交点。

 中点分割算法

一、基本思想

中点分割用到的测试方法仍然是编码测试,但是用二分逼近来确定直线段与窗口的交点。而具体的实现,也是根据中点的位置情况来讨论的。

二、具体实现

何为误差范围?

比如在1024的分辨率下,最多也就进行10次二分,不可能永远分下去。所以需要提前设定误差范围。

中点分割算法相比于Cohen-Sutherland算法,避免了求交,只需计算中点坐标即可完成,宜于硬件实现 。

Liang-Barsky算法


一、基本思想

 把被裁剪直线看成一条有向线段并用参数方程表示,进而确定出要获取的部分。

1.参数表示

2.方向设定确认点

将四条边分为入边和出边

u1u2则为裁剪区域内的线段

3.不等式变换

裁剪区域内的点可由以上不等式得到,移项变换得

我们可以

4.分类讨论

(1)pk=0

a. p1&p2=0,此时直线垂直,若q1<0或q2<0则直线在裁剪区域外,直接舍弃。

                           

b.  p3&p4=0,此时直线平行,若q3<0或q4<0则直线在裁剪区域外,直接舍弃。

                         

c.  p1&p2=0且q1≥0或q2≥0,p3&p4=0且q3≥0或q4≥0(即上图B和F的情况)。则进一步根据交点判断。

(2)pk≠0

此处根据具体的ΔxΔy数据来得到pk的正负

如图,此种情况为舍弃。u1>u2

二、具体实现

原文地址:https://www.cnblogs.com/jingrui/p/9697391.html