网站维护公告
2019-01-23

由于服务器限制,访问速度较慢。因此本站OmegaXYZ.com将于2019年1月23日至1月26日升级,提升访问速度。

在此期间,本站排名前10的文章将会置顶于CSDN博客:https://blog.csdn.net/xyisv

感谢您的关注与支持。

Cohen-Sutherland算法概述

思想

通过对于任一端点(x,y),根据其坐标所在的区域,赋予一个4位的二进制码,判断图形元素是否落在裁剪窗口之内并通过求交运算找出其位于内部的部分。

编码方式

注意:l为left,r为right,b为bottom,t为top

  • (1)若x小于wxl,D0=1,否则D0=0
  • (2)若x大于wxr,D1=1,否则D1=0
  • (3)若y小于wyb,D2=1,否则D2=0
  • (4)若y大于wyt,D3=1,否则D3=0

裁剪一条线段时,先求出端点p1和p2的编码code1和code2:
(1)如果code1和code2均为0,则说明P1和P2均在窗口内,那么线段全部位于窗口内部,应取之。
(2)如果code1和code2经过按位与运算后的结果code1&code2不等于0,说明P1和P2同时在窗口的上方、下方、左方或右方,那么线段全部位于窗口的外部,应弃之。
(3)当(1)和(2)不满足时,确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。
(4)求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。也即在交点s处把线段一分为二。考虑到p1是窗口外的一点,因此可以去掉p1s。转(2)。
(5)用直线扫描转换算法画出当前的直线段p1p2。
(6)算法结束。

算法的流程图

缺陷

(1)但是是对于在裁剪窗口直线内的线段,求交过程复杂,并且包含加、乘法、除法、浮点运算等,不利于硬件实现。
(2)由于采用编码思想,涉及到按位与运算,对程序的实现有特殊的要求;
(3)全部舍弃的判断只适合于那些仅在窗口同一侧(后左、或右、或上、或下)的线段。对于在裁剪窗口直线内的线段此算法不是很方便。

参考

https://blog.csdn.net/sinat_34686158/article/details/78745216

https://blog.csdn.net/vincent2610/article/details/47948737

读者评分
[评分人数: 1 平均分: 5]

评论

OmegaXYZ