Cohen-Sutherland算法

Cohen-Sutherland算法—python实现


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

算法思想:

这里写图片描述

对每条直线段p1(x1,y1)p2(x2,y2)分三种情况处理:
(1)

直线段完全可见,“简取”之。
(2) 直线段完全不可见,“简弃”之。
(3)直线段既不满足“简取”的条件,也不满足“简弃”的条件,需要对直线段按交点进行分段,分段后重复上述处理。

这里写图片描述

( 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。


算法步骤
(1) 输入直线段的两端点坐标:p1(x1,y1)、p2(x2,y2),以及窗口的四条边界坐标: XL、XR、YT和YB。
(2) 对p1、p2进行编码:点p1的编码为code1,点p2的编码为code2。
(3)若code1|code2=0,对直线段应简取之,转(6);否则,若code1&code2≠0,对直线段可简弃之,转(7);当上述两条均不满足时,进行步骤(4)。
(4) 确保p1在窗口外部:若p1在窗口内,则交换p1和p2的坐标值和编码。
(5) 求出直线段与窗口边界的交点,并用该交点的坐标值替换p1的坐标值。也即在交点s处把线段一分为二。考虑到p1是窗口外的一点,因此可以去掉p1s。转(2)。
(6) 用直线扫描转换算法画出当前的直线段p1p2。
(7) 算法结束。


测试代码
采用多边形来进行裁剪,只是对多边形的每条边单独裁剪画线。等同于是直线的集合,在这里我选择的测试多边形,边有全在窗口内的,有全部在窗口内的,有部分在窗口内部分在窗口外,还有更特殊的:顶点在裁剪窗口上,中点在裁剪窗口上等等,这样更具有良好的测试作用
polygon= [
[20,20],
[120,20],
[70,100],
[50,80],
[30,120],
[20,50],
[50,50]]


实验结果与分析

这里写图片描述

空间复杂度:算法最大的特点是采用了编码的思想,但是在这个4位编码是通过一个int型数来体现的,空间复杂度可以忽略不计。
时间复杂度:单条直线裁剪时,最坏的情况也就是直线在裁剪窗口内部,两顶点在裁剪窗口外部。不过这样也只是2次求交,所以时间复杂度近似为O(n)。多边形裁剪时,由于涉及到多条边,时间复杂度近似为O(n*e)


算法亮点与缺陷和感想
亮点:Cohen-Sutherland算法创新性的提出了用编码思想来解决裁剪问题。把整

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值