【计算机图形学】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进行编码。设其为code1code2。线段与窗口的位置分为以下三种情况:

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裁剪算法与中点分割算法在区码测试阶段能以位运算方式高效率地进行,当大多数线段能够简单地取舍时,效率较好。

参考书

《计算机图形学基础教程》孔令德

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Cohen-Sutherland直线裁剪算法是一种用于裁剪直线算法。它通过对直线的端点进行编码,并利用位运算来决定是否需要进行裁剪算法的步骤如下: 1. 将裁剪窗口分为九个区域,对应于二进制编码的九个位: - 0000: 线段完全在裁剪窗口内部 - 0001: 线段与窗口左边界相交 - 0010: 线段与窗口右边界相交 - 0100: 线段与窗口下边界相交 - 1000: 线段与窗口上边界相交 - 0101: 线段与窗口左下角相交 - 1001: 线段与窗口左上角相交 - 0110: 线段与窗口右下角相交 - 1010: 线段与窗口右上角相交 2. 对直线的两个端点进行编码,并根据编码判断线段是否需要进行裁剪。 - 如果两个端点的编码都为0000,表示线段完全在裁剪窗口内部,无需裁剪。 - 如果两个端点的编码的逻辑与运算结果不为0000,表示线段与窗口有交点,需要进行裁剪。 - 如果两个端点的编码的逻辑与运算结果为0000,表示线段与窗口无交点,且整条线段都在裁剪窗口外部,无需裁剪。 3. 如果线段需要进行裁剪,则根据需要裁剪的边界进行处理: - 如果线段与左边界相交,则根据线段方向求出相交点的坐标,并更新线段的起点。 - 如果线段与右边界相交,则根据线段方向求出相交点的坐标,并更新线段的终点。 - 如果线段与下边界相交,则根据线段方向求出相交点的坐标,并更新线段的起点。 - 如果线段与上边界相交,则根据线段方向求出相交点的坐标,并更新线段的终点。 4. 重复步骤2和步骤3,直到线段不需要裁剪或者已经被完全裁剪中点分割算法是另一种裁剪直线算法。它通过递归地将线段分割为左半边和右半边,并对每一半进行裁剪,直到无分割或者线段完全在裁剪窗口内部。 这两种算法都可以用来实现直线裁剪,具体选择哪种算法取决于具体的应用场景和需求。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值