Cohen-SutherLand算法(编码算法)
转自:http://my.oschina.net/liqiong/blog/4921
Cohen-SutherLand算法(编码算法)
基本思想:对于每条线段P1P2,分为三种情况处理:
(1)若P1P2完全在窗口内,则显示该线段,简称“取”之;
(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之;
(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。
为了使计算机能够快速的判断一条线段与窗口属于何种关系,采用如下编码方法:把窗口的边界延长成直线,窗口平台就分成9个分区,每个区设定一个4位的编码与之对应。
平面上每一条直线的端点根据其所在的区域都可定义出两个编码。
编码(以二进制形式自右向左给出)的意义如下:
(1)第0位:如果端点在窗口左边界左侧,则为1,否则为0;
(2)第1位:如果端点在窗口右边界右侧,则为1,否则为0;
(3)第2位:如果端点在窗口下边界下侧,则为1,否则为0;
(4)第3位:如果端点在窗口上边界上侧,则为1,否则为0。

裁剪一条线段时,先求出端点p1和p2的编码code1和code2:
(1)如果code1和code2均为0,则说明P1和P2均在窗口内,那么线段全部位于窗口内部,应取之。(c)
(2)如果code1和code2经过按位与运算后的结果code1&code2不等于0,说明P1和P2同时在窗口的上方、下方、左方或右方,那么线段全部位于窗口的外部,应弃之。(e,d)
(3)如果上述两种条件均不成立,则可按如下方法处理:求出线段与窗口边界的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。再对另一段重复进行上述处理,直到该线段完全被舍弃或者找到位于窗口内的一段线段为止。(a,b,d’)

此方法直观而方便,速度也较快。但是:
(1)由于采用按位与运算,对程序的实现有特殊的要求;
(2)全部舍弃的判断只适合于那些仅在窗口同一侧(后左、或右、或上、或下)的线段。

算法的特点:
(1)特点:用编码方法可快速判断线段--完全可见和显然不可见。
(2)特别适用二种场合:
大窗口场合;
窗口特别小的场合(如:光标拾取图形时,光标看作小的裁剪窗口)
例:根据区域编码裁剪算法对P1P2(P1[80,75],P2[-40,0])进行裁剪,以图解形式说明裁剪的过程(已知:XL=0,XR=100,YB=0,YT=50)。



Cohen-SutherLand算法(编码算法)的更多相关文章
- Java编码算法和摘要算法
		编码算法 编码算法是将一种形式转换成等价的另外一种形式.主要是为了方便某种特定场景的处理. 字母如何在计算机中表示呢? 用ASCII编码 那中文字符如何在计算机中表示呢? 用Unicode编码 如何同 ... 
- Android数据加密之Base64编码算法
		前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ... 
- 【字符编码】字符编码 && Base64编码算法
		一.前言 在前面的解决乱码的一文中,只找到了解决办法,但是没有为什么,说白了,就是对编码还是不是太熟悉,编码问题是一个很简单的问题,计算机从业人员应该也必须弄清楚,基于编码的应用有Base64加密算法 ... 
- 浅谈URLEncoder编码算法
		一.为什么要用URLEncoder 客户端在进行网页请求的时候,网址中可能会包含非ASCII码形式的内容,比如中文. 而直接把中文放到网址中请求是不允许的,所以需要用URLEncoder编码地址, 将 ... 
- 浅谈Hex编码算法
		一.什么是Hex 将每一个字节表示的十六进制表示的内容,用字符串来显示. 二.作用 将不可见的,复杂的字节数组数据,转换为可显示的字符串数据 类似于Base64编码算法 区别:Base64将三个字节转 ... 
- 浅谈Base64编码算法
		一.什么是编码解码 编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码. 解码:利用编码使用的算法的逆运算,对经过编码的 ... 
- 快来领取一场专门讲解UTF-8与UTF-16编码算法的GitChat活动的免费名额
		微信扫一扫,可打开该GitChat活动页面 字符编码是计算机世界里最基础.最重要.最令人困惑的一个主题之一.不过,在计算机教材中却往往浮光掠影般地草草带过,甚至连一本专门进行深入介绍的专著都找不到(对 ... 
- geohash编码算法在LBS中的应用
		随着移动终端的普及,很多应用都基于LBS功能,附近的某某(餐馆.银行.妹纸等等). 基础数据中,一般保存了目标位置的经纬度:利用用户提供的经纬度,进行对比,从而获得是否在附近. 目标: 查找附近的某某 ... 
- 编码算法-Base64
		Base64是一种编码算法,因为这种算法只支持64个[可打印字符],所以叫做Base64. 为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换.编码表的大小为2^6=64, ... 
随机推荐
- (五)Spring 对事务的支持
			第一节:事务简介 满足一下四个条件: 第一:原子性: 第二:一致性: 第三:隔离性: 第四:持久性: ------------------------------------------------- ... 
- CMS(Concurrent Mark-Sweep)垃圾回收器
			http://www.iteye.com/topic/1119491 1.总体介绍: CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器.对于要 ... 
- 以太坊go-ethereum客户端JSON-RPC API调用(一)
			前几篇博客主要介绍了go-ethereum客户端不同环境的搭建,今天这篇博客是建立在前几排博客的基础上.当搭建完成之后,我们可以通过各种方式与节点进行交互(JavaScript Console.JSO ... 
- 洛谷 P2708 硬币翻转 题解
			题目传送门 真如题面所说,难度系数:☆☆☆☆☆(如果你看懂了). 从后往前扫一次,如果a[i]==0&&a[i-1]==1那么将ans+2. 注意最后不要忘记开头if(a[0]=='0 ... 
- MVC – 4.mvc初体验(1)
			1.MVC请求模式 2.MVC简单请求流程图 展开 折叠 3.返回string的mvc方法 展开 折叠 4.加载视图的方法 
- Python--re模块的findall等用法
			1)正则表达式含义 . # 点可代表一切字符 \ # 起转义作用 [...] # 指代方括号中的任意字符 \d # 指代数字0-9 \D # 指代非数字 \s # 指代一切空格,包括tab制表符.空格 ... 
- day4递归原理及实现
			递归 特定: 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题十分有效,它往往是算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1)递归就是在过程 ... 
- python存取数据进阶技巧-pickle,array模块
			我们在存/取数据时,没有必要存成文本形式,多试试二进制形式,文本只是骗骗眼睛的,要更快和更高效 1.数组形式 如果我们需要一个之包含数字的列表,那就试试array.array,注意,不是numpy模块 ... 
- bzoj 1415 期望dp + 记忆化搜索
			思路:这个题看着感觉不能dp,其实是可以dp的,因为狼每次走两步,兔子每次走一步,每进行一轮以后,狼和兔子的距离 肯定是在接近的,没有相同的状态,dp之前预处理出来,每一步狼该往哪里走. #inclu ... 
- mongoDB学习第二天之常用方法
			mongoDB LIMIT 和 SKIP 方法 db.colName.find().limit(num) # limit 方法接收一个数字参数,该参数指定读取的记录条数 (db.colName.fi ... 
