开窗裁减

         在计算机图形学中,开窗裁减是一项基本操作,在显示图形子集的过程中,按照显示窗口的形状,对图形集合延窗口边线裁减,保留当前窗口内的部分,裁减掉窗口外的部分。地图标注也是基于这个基础,对窗口内的图形进行标注,同时控制标注的位置。开窗裁减是图形显示和标注的基础,在 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,表明两端点都在窗口内,应予以保留,无需裁减。

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

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

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

裁减。

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

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

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

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值