开窗裁减

GIS开窗裁减(Cohen-Sutherland线段裁减的改进算法                                                    Cohen-Sutherland线段裁减的改进算法                                                                      陈玉进 李泉                             南京跬 阅读详情
        在计算机图形学中,开窗裁减是一项基本操作,在显示图形子集的过程中,按照显示窗口的形状,对图形集合延窗口边线裁减,保留当前窗口内的部分,裁减掉窗口外的部分。地图标注也是基于这个基础,对窗口内的图形进行标注,同时控制标注的位置。开窗裁减是图形显示和标注的基础,在GIS平台内核每一步显示中,都要调用此功能,它的效率将直接影响整个地图显示的效率,本文将重点介绍如何进行矩形开窗裁减。

        矩形开窗裁减是最简单,也是最常用的一种裁减方式,折线、多边形的裁减都可以化归为线段的裁减,下面就讨论线段的矩形开窗裁减。有关开窗裁减的算法,已经比较成熟了,比较著名的算法有:Cohen-Sutherland 编码算法、梁友栋-Barsky算法,以及这些方法的改进。这里我们介绍Cohen-Sutherland 编码算法。

        线段裁减效率的瓶颈主要在线段求交判断上,建立方程求线段交点运算比较耗CPU时间,同时运算也是比较频繁的,减少不必要的线段求交是提高效率的关键。Cohen-Sutherland 编码算法,是用四个比特bit对平面9个区域进行编码,编码方法如图,

线段的端点落在哪个区域,线段的端点就拥有该区域的编码,如图:

        图中线段a的两端点A0100)、A‘(0010);线段d的两端点D0000)、D’(0000);线段g的两端点G1000)、G‘(1010);等等,以此类推,其他线段的两端点的编码也可以得到。对于一条线段,如果把两个端点的编码进行“按位与”运算,结果为两大类情况:

一,“按位与”结果非零,表明线段两端点位于同侧,不予裁减显示,如,线段g

二,“按位与”结果为零,这种情况又可以分为三种类型,

        1,两端点编码都为0000,则该线段全部位于窗口内而被显示,如,线段d

        2,其中只有一个端点的编码为0000,则该线段与窗口有一个交点,如,线段e

        3,两个端点的编码都不为0000,则该线段与窗口有两个交点或者无交点,如,线段a,两端点都不为0000,与窗口无交点,线段f,两端点都不为0000,与窗口有两个交点。

        以上就是Cohen-Sutherland 编码算法的思路,在同侧的线段“按位与”结果非零,容易排除,全部在窗口内的线段,也比较容易确定,其他很多情况需要进一步判断和处理,才能确定如何进行裁减,而这一判断处理过程通常需要进行线段求交,如何有效地确定线段与窗口的交点,以及如何有效地排除与窗口无交点的情况,从而达到有效减少相交运算的次数,将是下面要重点考虑的,本文将对此情况进行详细地分析。

        我们知道,线段与窗口的交点个数,只有三种可能:1,无交点;2,一个交点;3,两个交点。下面我们就各种情况给予详细说明。

        线段两端点编码进行“按位与”运算,结果非零,表明线段位于同侧,应予以排除,无需裁减显示。

        以下情况为线段两端点编码进行“按位与”运算,当结果为非零的时候,再进行“按位或”运算。

        一、当“按位或”运算结果等于0000,表明两端点都在窗口内,应予以保留,无需裁减。

        二、当“按位或”运算结果等于“上下左右”区域的编码,即1000010000100001这四个数,根据“按位或”的结果,即可判断线段与哪个窗口边线相交。

        三、当“按位或”运算结果等于11000011。表明两端点分别位于对面的区域内,即“上下”或者

“左右”,根据根据“按位或”的结果,即可判断是与上下两个边线求交裁减,或者左右两个边线求交

裁减。

        四、当“按位或”运算结果等于1001010110100110,即结果等于四个角区域的编码,这种情况分两类:一类是其中一个端点位于0000区域内,只存在一个交点,需要进行一次求交运算测试,判断需要与哪条窗口边线求交裁减;一类是两个端点都位于相邻的斜对角区域,存在两个交点或者无交点,也是需要一次求交测试,才能判断。这两类通过通过判断是否有端点的编码是0000来进一步区分。

        五、当“按位或”运算结果等于1101101111100111,即,存在三位数为“1”,一个端点位于

角区域之一,一个点位于上下左右区域之一,存在两个交点或者无交点,需要进行零次或者两次测试,

由“按位或”的结果,先与正区域的窗口边线求交测试,如果不存在交点,表明无交点,直接舍弃,如

图线段a,如果存在交点,如图线段b,c,则需要再进行一次求交测试,判断与哪条窗口边线相交。

        六、当“按位或”运算结果等于1111,即,两端点位于对角的角区域上,存在两个交点或者无交点,也有两种情况,需要根据一个端点的编码判断是其中的哪一种情况,确定以后,需要进行一次求交测试,相交的两条窗口边界是相邻的。

        以上先进行了线段端点的“按位与”运算,排除掉结果非零的情况,针对结果为零的情况,再进行“按位或”运算,分各种情况进行了讨论。

        开窗裁减,在GIS引擎开发中,是图形显示,窗口内图形标注的前提,尤其是矩形的线段开窗裁减最常用,也最具代表性,为多边形的面裁减,多边形窗口的裁减提供了思路,在计算机图形学、GIS中有着特殊的意义。

GIS面裁减  GIS面裁减李泉   陈玉进(南京跬步科技有限公司http://www.creable.cn )裁剪是从数据集合中抽取所需信息的过程,它是地理信息系统中许多重要问题的基础。裁剪最典型的用途是开窗裁剪,即将当前窗口显示范围之外的部分切除,以至于不绘制或者不标注不需要的部分。除了开窗裁剪之外,使用硬网格索引在处理数据阶段也需要将地图数据按照网格裁切为一个个的块状区域。叠加分析需要用的任意 阅读详情

相关推荐

prokka-原核及病毒基因组高效便捷注释

文章目录简介安装使用参考 简介 Prokka: rapid prokaryotic genome annotation 全基因组注释是在一组基因组DNA序列中识别感兴趣的特征,并用有用的信息标记它们的过程。Prokka是一款软件工具,可以快速注释细菌、古生菌和病毒基因组,并生成符合标准的输出文件。 安装 conda install -c conda-forge -c bioconda -c defaults prokka Test Type prokka and it should output its

Neptuneyut的博客 3287

使用 OpenCV 裁剪图像

通过本篇博客的学习,读者应该能够掌握图像处理的基础知识,包括如何在Python中加载和处理图像。我们介绍了如何将一张大图像分割成小块,这在处理大型图像或进行细致的图像分析时特别有用。此外还探讨了图像处理的一些高级应用,例如使用预训练的深度学习模型进行图像识别。这些内容不仅涉及了基础知识,还拓展到了更为高级的应用,为读者提供了一个全面而深入的学习路径。

Mr数据杨 623

Graylog日志系统实战:高效接收与解析交换机日志

本文提供Graylog日志系统的实战部署与配置指南,重点讲解如何高效接收与解析交换机日志。通过Docker快速部署,配置Syslog输入,并指导华为、华三等主流交换机将日志发送至Graylog。文章还介绍了使用提取器解析日志字段、创建数据流进行分类,以及设置报警规则,实现从被动排查到主动预警的运维转变,帮助网络工程师构建集中、智能的日志管理系统。

weixin_29284885的博客 509

任意多边形切割/裁剪(附C#代码实现)

原文:https://www.cnblogs.com/lsxqw2004/p/4843417.html 本实现主要参考了发表于2003年《软件学报》的《一个有效的多边形裁剪算法》(刘勇奎,高云,黄有群)这篇论文,所使用的理论与算法大都基于本文,对论文中部分阐述进行了详细解释,并提取了论文中一些重要的理论加以汇总。另外对于论文描述无法处理的一些情况也进行了试探性的分析。 多边形裁剪用于裁剪掉被裁剪多边形(又称为实体多边形,后文用S表示)位于窗口(又称为裁剪多边形,后文用C表示)之外的部分。裁剪的.

信箱神、得引擎 2623

C# 处理图片 不规则图形裁剪

最近项目要求实现不规则裁剪功能。本来想用html5的canvas在前端实现的,但是发现有点困难,以下为C#端对图对片的处理。 为了让大家知道下面内容是否是自己想要的,我先发效果图。                           原图                     通过下面代码中的坐标得到的截图                        好了,那就开始贴代码了 以下...

xiatiancc的专栏 3877

图像开窗变换Java

图像(像素)的开窗变换 像素值计算公式(部分):y=255*(x-cw+ww/2)/ww cw:窗位;ww:窗宽 上图处理前: 处理后: 来看看代码: import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ch3_2 { public static

qq_43671697的博客 882

医学图像开窗操作

准备工作读取DICOM格式图像。

2201_75709573的博客 682

解一元二次方程lisp_第二章_计算机图形处理技术.ppt

第二章_计算机图形处理技术这是计算机图形学的重要内容,涉及的是计算机对图形输入、输出以及各种操作处理技术。主要包括图形变换技术、计算机辅助绘图、曲线与曲面构造等等基本原理与方法。需要指出的是本章所讲的都是计算机图形处理技术的基础技术,如有兴趣可以参考有关计算机图形学的知识。 推荐阅读:清华大学计算机系国家CAD工程中心 /xdjyj...

weixin_29458017的博客 270

网格索引

http://blog.csdn.net/sjzwl/archive/2008/10/06/3020173.aspx 网格索引就是在一个地图图层上,按每个小网格宽△w,高△h打上均匀的格网,计算每个图元所占据的网格或者所经过的网格单元集合, [img]http://nlslzf.iteye.com/upload/attachment/94725/ae08aed1-53db-3e7c-8c8c-...

nlslzf的专栏 327

空间索引使用的意义及网格索引和四叉树索引简单介绍

空间索引 在介绍空间索引之前,先谈谈什么叫“索引“。对一个数据集做”索引“,是为了提高对这个数据集检索的效率。书的”目录“就是这本书内容的”索引“,当我们拿到一本新书,想查看感兴趣内容的时候,我们会先查看目录,确定感兴趣的内容会在哪些页里,直接翻到那些页,就OK了,而不是从第一章节开始翻,一个字一个字地找我们感兴趣的内容,直到找到为止,这种检索内容的效率也太低了,如果一本书没有目录,可以想

gisqd的专栏 1679

计算机图形与OpenGL学习六(二维观察4.Cohen-Sutherland线段裁剪算法)

 Cohen-Sutherland线段裁剪算法二维线段裁剪相关基础概念请转到链接:计算机图形与OpenGL学习六(二维观察3.二维点与二维线段的裁剪)Cohen-Sutherland线段裁剪算法,通过初始测试来减少交点计算,从而减少线段裁剪算法所用的时间。每条线段的端点都赋以称为区域码的四位二进制码,每一位用来标识端点相对于相应裁剪矩形边界的里面还是外面。我们可以按任意顺序引用窗口边界,图1给出了...

lhs322的博客 2362

MATLAB学习之图像增强、线性运算、非线性运算、CT图像的开窗显示

图像增强的目的: 图像增强的目标是通过处理图像,提高图像重要细节信息或者目标的辨识度,使其比原始图像更适应于特定应用。 不增加图像的信息内容,但是增加特定特征的动态范围( dynamic range ),使该特征更容易被检测和识别。 图像增强的内容&方法 改变像素的灰度值 通过灰度变换函数改变像素的灰度值。 点运算即输出的像素灰度值仅仅由输入的像素灰度值决定: Out[x, y] = f (In[x, y]); 线性点运算 例:读取 dicom 图像,完成以下操作: 利用线性函

weixin_45965683的博客 4729

计算机图形学——裁剪

裁剪作用:选择显示的内容--图形在窗口内的部分被显示出来,窗口外的部分被裁剪图形中每个图形基本元素都要经过裁剪,因此裁剪直接影响整个图形系统的效率。 裁剪窗口:矩形,凸多边形,任意多边形裁剪类型:二维裁剪、三维裁剪裁剪对象:直线段、多边形、文字等裁剪方法:直线的裁剪方法: Sutherland-Cohen算法 , Cyrus-Beck算法,梁友栋-Barsky算法多边形的裁剪方法:Suthe...

微赚开发者技术分享博客 3570

常见的开窗函数

开窗函数与聚合函数计算方式一样,开窗函数也是对行集组进行聚合计算,但是它不像普通聚合函数那样每组只返回一个值,开窗函数可以为每组返回多个值。 开窗函数的语法为:over(partition by 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。 开窗函数主要分为以下两类: 窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。

u013986335的博客 8846

mysql over_mysql 中如何实现over 方法(开窗函数)

mysql中如何实现over方法(开窗函数)在绝大多数关系型数据库中都实现了over方法(开窗算法)。但是mysql是没有实现这个方法。所以在一下场景下是很难受的。比如:对同一组中的人员按照成绩排序或只取同一组中的前2名。下面是一个示例。在这里我就不去验证了。大致讲解一下该sql的含义:select column01,column02,column03,column04 from (sele...

weixin_42545636的博客 3914

Hive开窗函数源码

整体思路 rank和row_number使用起来的区别就是相同的排序,rank是相同的,并且排名不是连续的 这里需要放一下例子 支持window字句的源码分析 sum字句 GenericUDAFSumLong buff 存的是long:就是当前分区下所有的累加和 StreamingState extends AbstractAggregationBuffer : 存的是(list)分区每一行的结果,比如就是 前10行到,前两行的结果 SumAvgStreamingState extends Stre

samll_DATA的博客 486

掌讯公版8219升8227USB升级包.rar

掌讯公版8219升8227USB升级包,解压到U盘根目录,车机彻底断电后插入U盘,然后进入设置,通用设置,系统信息,Android升级。期间不要断电,等待升级完成后,按提示操作。刷机有风险

上一篇: 空间索引
下一篇: 二调ARCGIS符号库
sjzwl
博客等级 码龄19年 61粉丝 44原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值