矩形开窗裁减是最简单,也是最常用的一种裁减方式,折线、多边形的裁减都可以化归为线段的裁减,下面就讨论线段的矩形开窗裁减。有关开窗裁减的算法,已经比较成熟了,比较著名的算法有:Cohen-Sutherland 编码算法、梁友栋-Barsky算法,以及这些方法的改进。这里我们介绍Cohen-Sutherland 编码算法。
线段裁减效率的瓶颈主要在线段求交判断上,建立方程求线段交点运算比较耗CPU时间,同时运算也是比较频繁的,减少不必要的线段求交是提高效率的关键。Cohen-Sutherland 编码算法,是用四个比特bit对平面9个区域进行编码,编码方法如图,
图中线段a的两端点A(0100)、A‘(0010);线段d的两端点D(0000)、D’(0000);线段g的两端点G(1000)、G‘(1010);等等,以此类推,其他线段的两端点的编码也可以得到。对于一条线段,如果把两个端点的编码进行“按位与”运算,结果为两大类情况:
一,“按位与”结果非零,表明线段两端点位于同侧,不予裁减显示,如,线段g ;
二,“按位与”结果为零,这种情况又可以分为三种类型,
1,两端点编码都为0000,则该线段全部位于窗口内而被显示,如,线段d,
2,其中只有一个端点的编码为0000,则该线段与窗口有一个交点,如,线段e,
3,两个端点的编码都不为0000,则该线段与窗口有两个交点或者无交点,如,线段a,两端点都不为0000,与窗口无交点,线段f,两端点都不为0000,与窗口有两个交点。
以上就是Cohen-Sutherland 编码算法的思路,在同侧的线段“按位与”结果非零,容易排除,全部在窗口内的线段,也比较容易确定,其他很多情况需要进一步判断和处理,才能确定如何进行裁减,而这一判断处理过程通常需要进行线段求交,如何有效地确定线段与窗口的交点,以及如何有效地排除与窗口无交点的情况,从而达到有效减少相交运算的次数,将是下面要重点考虑的,本文将对此情况进行详细地分析。
我们知道,线段与窗口的交点个数,只有三种可能:1,无交点;2,一个交点;3,两个交点。下面我们就各种情况给予详细说明。
以下情况为线段两端点编码进行“按位与”运算,当结果为非零的时候,再进行“按位或”运算。
一、当“按位或”运算结果等于0000,表明两端点都在窗口内,应予以保留,无需裁减。
三、当“按位或”运算结果等于1100、0011。表明两端点分别位于对面的区域内,即“上下”或者
“左右”,根据根据“按位或”的结果,即可判断是与上下两个边线求交裁减,或者左右两个边线求交
裁减。
五、当“按位或”运算结果等于1101、1011、1110、0111,即,存在三位数为“1”,一个端点位于
角区域之一,一个点位于上下左右区域之一,存在两个交点或者无交点,需要进行零次或者两次测试,
由“按位或”的结果,先与正区域的窗口边线求交测试,如果不存在交点,表明无交点,直接舍弃,如
图线段a,如果存在交点,如图线段b,c,则需要再进行一次求交测试,判断与哪条窗口边线相交。
以上先进行了线段端点的“按位与”运算,排除掉结果非零的情况,针对结果为零的情况,再进行“按位或”运算,分各种情况进行了讨论。
开窗裁减,在GIS引擎开发中,是图形显示,窗口内图形标注的前提,尤其是矩形的线段开窗裁减最常用,也最具代表性,为多边形的面裁减,多边形窗口的裁减提供了思路,在计算机图形学、GIS中有着特殊的意义。