一、引入
1. 为什么要裁剪?——使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的知识图形的一部分。因此需要确定图形哪些部分落在显示区之内,哪些落在显示区之外。这个过程就称为裁剪。
2. 点的裁剪——只需判断点的坐标在不在矩形区域内,但判断图形中每个点是否在窗口内,太费时,不可取。
3. 直线段的裁剪——为复杂图形裁剪的基础。
要裁剪一条直线段,首先要判断:
1)它是否完全落在裁剪窗口内?
2)它是否完全在窗口外?
3)如果不满足以上两个条件,则计算它与一个或多个裁剪边界的交点。
常用的裁剪算法有三种:Cohen-Sutherland、中点分割法、Liang-Barsky裁剪算法。
一、Cohen-Sutherland算法(编码裁剪算法)
1. 算法原理:
对每条直线分三种情况处理:
1)若点P1和P2完全在裁剪窗口内,“简取”之。
2)若P1(x1,y1)和P2(x2,y2)均在窗口外,且满足下列四个条件之一,“简弃”。
x1 < xleft 且 x2 < xleft
x1 > xright 且 x2 > xright
y1 < ybottom 且 y2 < ybottom
y1 > ytop 且 y2 > ytop
3)如果直线段既不满足“简取”条件,也不满足“简弃”条件,需要对直线进行分段,然后判断是“简取”还是“简弃”。
2. 编码
1° 每条线段的端点都赋以四位二进制码D3D2D1D0,编码规则如下:
若 x < xleft,则D0 = 1,否则D0 = 0;——对应左边界
若 x > xright,则D1 = 1,否则D1 = 0;——对应右边界
若 y < ybottom,则D2 = 1,否则D2 = 0;——对应下边界
若 y > ytop,则D3 = 1,否则D3 = 0;——对应上边界
窗口及其延长线所构成了9个区域。根据该编码规则:
2° 裁剪一条线段时,先求出端点p1和p2的编码code1和code2,然后进行二进制“或”运算和“与”运算
1)若code1丨code2 = 0,对直线段应简取;
2)若code1 & code2 ≠ 0,对直线应简弃;
3)若上述两条件均不成立,则需求出直线段与窗口边界的交点,在交点处把线段一分为二;
下面根据该算法步骤裁剪如图所示的直线段P1P2,按照左右上下的顺序求出直线段与窗口左边界的交点为P3,P1P3必在窗口外,可简弃。对P2P3重复上述处理。
剩下的直线段P3P4再进一步判断,code1 丨code2 = 0,全在窗口中,简取。
3. 算法评价:比较适合两种情况,一是大部分线段完全可见;二是大部分线段完全不可见。