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

时间: 2024-10-18 06:50:05

Cohen-SutherLand算法(编码算法)的相关文章

Cohen Sutherland裁剪算法并使用OpenGL实践

还是其几天写的,这是最简单的一个直线裁剪算法了吧,它针对的是一个矩形和一条线段.并且还是边与坐标轴平行的矩形. 在实际应用上应该会经常用于屏幕对各种线段的裁剪吧.算法很简单效率也很高. 首先是算法的两种特例:平凡接受和平凡拒绝. (图片来自<计算机图形学(OpenGL)>第三版) 当线段的两个端点都在矩形内部,则平凡接受,不需要裁剪.如图中的AB.而当线段的两个端点都在某条边的外边时,平凡拒绝,也不需要裁剪.如图中的CD. 检测这两种情况的方法可以先形成两个端点的码字,如下: 那么可以得到如下

浅谈Hex编码算法

一.什么是Hex 将每一个字节表示的十六进制表示的内容,用字符串来显示. 二.作用 将不可见的,复杂的字节数组数据,转换为可显示的字符串数据 类似于Base64编码算法 区别:Base64将三个字节转换为四个字符,Hex将三个字节转换为六个字节 三.应用场景 在XML,JSON等文本中包含不可见数据(二进制数据)时使用 四.使用 1.将字节数组转换为字符串 1 /** 2 * 将字节数组转换为字符串 3 * 一个字节会形成两个字符,最终长度是原始数据的2倍 4 * @param data 5 *

deep learning 自编码算法详细理解与代码实现(超详细)

在有监督学习中,训练样本是有类别标签的.现在假设我们只有一个没有带类别标签的训练样本集合 ,其中 .自编码神经网络是一种无监督学习算法,它使用了反向传播算法,并让目标值等于输入值,比如 .下图是一个自编码神经网络的示例.通过训练,我们使输出 接近于输入 .当我们为自编码神经网络加入某些限制,比如限定隐藏神经元的数量,我们就可以从输入数据中发现一些有趣的结构.举例来说,假设某个自编码神经网络的输入 是一张 张8*8 图像(共64个像素)的像素灰度值,于是 n=64,其隐藏层 中有25个隐藏神经元.

栈式自编码算法

学习UFDL栈式自编码算法的笔记 深度网络的优势 深度神经网络,即含有多个隐藏层的神经网络.通过引入深度网络,我们可以计算更多复杂的输入特征.因为每一个隐藏层可以对上一层的输出进行非线性变换,因此深度神经网络拥有比"浅层"网络更加优异的表达能力(例如可以学到更加复杂的函数关系). 其实三层网络,只要能无限增加隐层的单元数就能拟合任何函数.而使用深度网络的最主要优势是:它能以更加紧凑简洁的方式来表达比浅层网络大得多的函数集合.正式点说,我们可以找到一些函数,这些函数可以用k层网络简洁地表

Android数据加密之Base64编码算法

前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算法,为何要使用Base64编码呢?它解决了什么问题?这也是本文探讨的东西?下面是其他数据加密链接地址: Android数据加密之Rsa加密 Android数据加密之Aes加密 Android数据加密之Des加密 Android数据加密之MD5加密 什么Base64算法? Base64是网络上最常见的

快来领取一场专门讲解UTF-8与UTF-16编码算法的GitChat活动的免费名额

微信扫一扫,可打开该GitChat活动页面 字符编码是计算机世界里最基础.最重要.最令人困惑的一个主题之一.不过,在计算机教材中却往往浮光掠影般地草草带过,甚至连一本专门进行深入介绍的专著都找不到(对这一点我一直很困惑,为什么就没有哪位大牛对这个如此基础.重要而又如此容易让人困惑的主题写一本专著予以介绍呢). 字符编码的基础性.重要性,主要体现在它涉及面广.向下涉及到计算机的底层技术,甚至是硬件实现:向上几乎跟所有的操作系统.编程语言.应用程序都密切相关.而字符编码之所以成为了最令人困惑的主题之

Elias-Fano编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路

Elias-Fano编码过程如下:把一组整数的最低l位连接在一起,同时把高位以严格单调增的排序划分为桶. Example: 2, 3, 5, 7, 11, 13, 24 Count in unary the size of upper bits "buckets" including empty ones:110=>计算最大的桶,此处是110,计算方法如下:Maximum bucket: [U / 2^l]Example: [24 / 2^2] = 6 = 110 连接最低位:

DeepLearning (四) 基于自编码算法与softmax回归的手写数字识别

[原创]Liu_LongPo 转载请注明出处 [CSDN]http://blog.csdn.net/llp1992 softmax 回归模型,是logistic 回归模型在多分类问题上的推广.关于logistic回归算法的介绍,前面博客已经讲得很清楚,详情可以参考博客 机器学习实战ByMatlab(五)Logistic Regression 在logistic回归模型中,我们的激励函数sigmoid的输入为: z=θ0x0+θ1x1+θ2x2+...+θnxn 则可以得到假设函数为: hθ(x)

【坐在马桶上看算法】算法12:堆——神奇的优先队列(下)

接着上一Pa说.就是如何建立这个堆呢.可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入(转移到堆中为止).因为插入第i个元素的所用的时间是O(log i),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下. n=0; for(i=1;i<=m;i++) {     n++;     h[ n]=a[ i];  //或者写成scanf("%d",&h[ n]);     siftup(); } 其实我们还有更快得方法来建立堆.它是这样的. 直接