Cohen-Sutherland直线裁剪算法

版权声明:欢迎转载,请注明出处。 https://blog.csdn.net/jxch____/article/details/80726853

在二维观察中,需要在观察坐标系下根据窗口大小对二维图形进行裁剪(clipping),只将位于窗口内的图形变换到视区输出。直线段裁剪是二维图形裁剪的基础,裁剪的实质是判断直线段是否与窗口相交,如相交则进一步确定直线段上位于窗口内的部分。

编码原理

Cohen-Sutherland直线段裁剪算法是最早流行的编码算法。每段直线的端点都被赋予一组四位二进制代码,称为区域编码(region code,RC),用来标识直线段端点相对于窗口边界及其延长线的位置。
假设窗口是标准矩形,由上、下、左、右4条边界组成,延长窗口的4条边界形成9个区域。这样根据直线段的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制编码,称为区域码RC=C3C2C1C0。C0代表左边界, C1代表右边界, C2代表下边界, C3代表上边界。
这里写图片描述
为了保证窗口内及窗口边界上直线段端点的编码为零,定义规则如下:
C0:若端点的 x < wxl,则C0=1,否则C0=0。
C1:若端点的x > wxr,则C1=1,否则C1=0。
C2:若端点的y < wyb,则C2=1,否则C2=0。
C3:若端点的y > wyt,则C3=1,否则C3=0。

裁剪步骤

  1. 若直线段的两个端点的区域编码都为0,有RC0|RC1=0(二者按位相或的结果为零,即RC0=0且RC1=0),说明直线段的两个端点都在窗口内,应“简取”之(trivally accepted)。
  2. 若直线段的两个端点的区域编码都不为0,且RC0&RC1≠0(二者按位相与的结果不为零,即RC0≠0且RC1≠0),说明直线段位于窗外的同一侧,或左方、或右方、或上方、或下方,应“简弃”之(trivally rejected) 。
  3. 若直线段既不满足“简取”也不满足“简弃”的条件,则需要与窗口进行“求交”判断。这时,直线段必然与窗口边界或窗口边界的延长线相交分两种情况处理

这里写图片描述
P0点的编码为0010。P1点编码为0000。交点P在窗口边界上,编码为0000。 根据编码判断PP1被简取。
Cohen-sutherland算法的关键技术:在于总是要让直线段的一个顶点处于窗口之外,例如P0点。这样P0点到交点P的直线段必然不可见,故可以直接抛弃。
这里写图片描述
直线段必然与窗口边界或窗口边界的延长线相交,分两种情况处理。
这里写图片描述
裁剪直线段时,一般按固定顺序左(x=wxl),右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口边界与直线段的交点。

交点计算公式

对于端点坐标为P0(x0,y0)和P1(x1,y1)的直线段,
与窗口左边界(x=wxl)或右边界(x=wxr)交点的y坐标的计算公式为
y = k ( x x 0 ) + y 0
与窗口上边界(y=wyt)或下边界(y=wyb)交点的x坐标的计算公式为
x = y y 0 k + x 0
其中, k = y 1 y 0 x 1 x 0

猜你喜欢

转载自blog.csdn.net/jxch____/article/details/80726853