Cohen–Sutherland 算法介绍(简单易懂)

目录

一、算法介绍

二、算法描述

三、算法总结


一、算法介绍

  Cohen–Sutherland 算法用于直线段裁剪,通过判断直线与窗口之间的关系,来决定直线段部分的保留与舍弃。示意图如下:

裁剪前

 

裁剪后

 

二、算法描述

  ① 首先,我们把屏幕分割成 9 个区域块,最中间区域块是窗口(裁剪面),其余 8 个区域块在它周围。我们用 4 位二进制来标记每个区域块:

粉色数字即4位二进制标记

关于4位二进制的表示法 ,参考图如下:

 第1位,如果该区域块位于Top域,则为1,否则为0;

 第2位,如果该区域块位于Bottom域,则为1,否则为0;

 第3位,如果该区域块位于Right域,则为1,否则为0;

 第4位,如果该区域块位于Left域,则为1,否则为0;

② 接下来就是对于各种不同类型待裁剪线段的区分。比方说有以下若干线段:

  我们根据线段两端点位于的区域块位置来区分线段类型,可总结出以下三种类型的线段:

A、Completely inside:线段两端点都在窗口内

B、Completely outside:线段两端点都在窗口外

C、Partially inside:线段一个端点在窗口内,一个端点在窗口外

③ 那么如何通过算法来区分出以上三种线段类型呢?方法如下:

  设线段两端点分别为C1,C2

  如果两端点区域块代码都是0000,则对应类型A保留线段

  否则将端点C1和C2执行逻辑与运算,如果结果不是0000,则线段两端点一定都在窗口外,对应类型B不保留线段

  否则如果两端点区域块代码不都是0000,但逻辑与后结果是0000,则对应类型C,需要对线段进行求交裁剪操作。

④ 对C类型线段进行求交裁剪。方法很简单,将C类型线段与裁剪面的四个边界依次进行求交即可,步骤如下图:

裁剪过程示意图

三、算法总结

  Cohen–Sutherland 算法伪代码如下:

第 1 步:为给定线段的两个端点分配4位二进制区域代码。
第 2 步:如果两个端点的区域代码都是0000,则表明线段完全在窗口内。
第 3 步:否则,对两个区域块代码执行逻辑与运算{
    如果结果不是0000,那么线段全在窗口外部,
    else 如果结果是0000,表明线段部分位于窗口内部{
         找到线段与窗口的交点,
         用交点替换线段的端点,并更新4位二进制区域代码,
         重新回到第 2 步,一直到剪裁完成再退出。
    }
}

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值