CG-光栅图形学裁剪算法-学习笔记

一、引入

1. 为什么要裁剪?——使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的知识图形的一部分。因此需要确定图形哪些部分落在显示区之内,哪些落在显示区之外。这个过程就称为裁剪

2. 点的裁剪——只需判断点的坐标在不在矩形区域内,但判断图形中每个点是否在窗口内,太费时,不可取。

3. 直线段的裁剪——为复杂图形裁剪的基础。

要裁剪一条直线段,首先要判断:

1)它是否完全落在裁剪窗口内?

2)它是否完全在窗口外?

3)如果不满足以上两个条件,则计算它与一个或多个裁剪边界的交点。

常用的裁剪算法有三种:Cohen-Sutherland中点分割法Liang-Barsky裁剪算法

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

1. 算法原理:

对每条直线分三种情况处理:
1)若点P1和P2完全在裁剪窗口内,“简取”之。 

2)若P1(x1,y1)和P2(x2,y2)均在窗口外,且满足下列四个条件之一,“简弃”。

x< xleft       且      x< xleft

x> xright     且      x> xright

y< ybottom  且      y< ybottom

y> ytop       且      y> ytop

3)如果直线段既不满足“简取”条件,也不满足“简弃”条件,需要对直线进行分段,然后判断是“简取”还是“简弃”。

 2. 编码

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

若 x < xleft,则D= 1,否则D= 0;——对应左边界

若 x > xright,则D= 1,否则D= 0;——对应右边界

若 y < ybottom,则D= 1,否则D= 0;——对应下边界

若 y > ytop,则D= 1,否则D= 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. 算法评价:比较适合两种情况,一是大部分线段完全可见;二是大部分线段完全不可见。

猜你喜欢

转载自www.cnblogs.com/mzyan/p/9773844.html