裁剪是计算机图形学的基本问题之一。在使用计算机处理图形信息时,计算机内部存储的图形信息往往比较大,而平面显示只是图形的一部分,这时可以采用缩放技术,把图中的局部区域放大显示,通过定义窗口和视区,即可把图形的某一部分显示在屏幕的指定位置。正确识别图形在窗口内部分(可见部分)和窗口外部分(不可见部分),以便把窗口内的图形信息输出,而窗口外的部分则不输出,这种选择可见信息的方法称为裁剪。本节介绍窗视变换与裁剪技术。
一.窗口视图变换
1.坐标系
1)用户坐标系
用户坐标系又称世界坐标系,可用右手定则的三维直角坐标系表示,是用户在定义一个图形时,用来描述图形中各元素的位置、形状和大小的坐标系。坐标系的原点可由用户根据图形的实际情况任意选定,其度量单位可以是任意长度单位,它的定义域是整个实数域,从理论上讲这个域是无限连续的,实际应用中常取实数域的某一部分。
2)设备坐标系
设备坐标系是图形输出设备(如显示器、绘图机等)自身具有的坐标系。设备坐标系是一个二维平面坐标系,它的度量单位常常是一个步长(绘图机),或者是一个光栅单位(显示器),所以它的定义域是一个不连续的整数域,同时又是有界的。
3)观察坐标系
观察坐标系一是用于指定裁剪空间,确定物体要显示输出的部分;二是用来通过在观察坐标系中定义观察平面,把三维物体的用户坐标系变换为规格化设备坐标系,它可以定义在用户坐标系中的任何位置,是一个符合左手定则的直角坐标系。
4)规格化设备坐标系
规格化设备坐标系是左手定则直角坐标系,用来定义视图区,是与具体设备无关的规格化的设备坐标系。应用程序可指定它的取值范围,其约定的取值范围是(0.0,0.0,0.0,0.0)到(1.0,1.0,1.0,1.0)。用户的图形数据经转换成规程化设备坐标系中的值,使应用程序与图形设备隔离,增强了应用程序的可移植性。
2、图形的输出
1)窗口与视区
工程设计中,有时为了突出显示图形的某一部分,而把该部分单独画出。在计算机图形学中,通过引入“窗口”概念,通过在整图中开“窗口”的方法,实现把指定的局部图形从整体中正确分离出来。
窗口是在用户坐标系中定义、用以确定显示内容的一个矩形区域,它是在用户坐标系中开一个子域(称为用户窗口),凡是落在该窗口内的图形信息,都将在图形设备上以设备坐标的形式在视图区中满屏输出。为了处理的方便,在二维图形中,用户窗口一般设定为一个矩形区域,并可以用该矩形域的左下角和右上角的坐标来定义。如图2-11a所示。
图2-11 窗口和视区
视图区是用户在屏幕上定义的一个小于或等于屏幕的区域。视图区是用设备坐标系来定义的,通常也设定为矩形。同样可以用该矩形的左下角点和右上角点坐标来定义(如图2-11b所示)。定义小于屏幕的视图区通常是很有用的,因为这样可以在同一屏幕上定义多个视区,用来显示不同的图形信息,例如,可以在同一屏幕中显示零件的三视图和轴测图、菜单指令、系统信息等。
2)窗口区和视图区的坐标变换
由于窗口和视图区是在不同的坐标系中定义的,所以要把窗口内的图形信息送到视图区,在输出之前必须进行坐标变换。这种把用户坐标系下的一个子域映射到屏幕坐标系下的一个子域的变换,称为窗视变换。
如图2-12所示,窗口中的点(XW,YW )对应屏幕视图区中的点(XV,YV ),其变换公式为
图2-12 窗、视变换示意图
(2-19)
对于用户定义的一张整图,需要把图中每条线段的端点都用上式进行转换,才能形成屏幕上的相应图形。从上述变换关系可见:
(1) 视图区大小不变,窗口区缩小或放大时,所显示的图形会相反地放大或缩小;
(2) 窗口区大小不变,视图区缩小或放大时,所显示的图形会相应地缩小或放大;
(3) 窗口区与视图区大小相同时,所显示的图形大小比例不变;
(4) 视图区纵横比不等于窗口区纵横比时,显示的图形会有X、Y方向的伸缩变化。
利用开窗口技术,可灵活地在屏幕上显示一景物的不同部分。改变窗口及视区的大小和位置,可使显示的图形发生变化。例如,改变视区的位置,可使画面在显示设备的不同位置出现;改变视区的大小,可使所显示的画面成比例地改变尺寸。再如,改变窗口的大小,可产生变焦距(又称为缩放)效果:窗口变小时,可以观察到物体的细节;窗口变大时,物体相对变小,可观察到景物的全貌。如果窗口的大小不变只改变其位置,使窗口掠过要观察的物体,则可产生摇镜头(又称为漫游或扫视)的效果。
3)二维图形的输出流程
用户定义的图形从窗口区到视图区的输出过程如图2-13所示。
图2-13 二维图形的输出流程
4)三维图形的输出流程
三维图形的输出一般需经过三维裁剪后将落在三维窗口内的形体经过投影变换,变成二维图形,再在指定的视图区内输出,其输出过程如图2-14所示。
2-14 三维图形的输出流程
二.点的裁剪
进行裁剪时一般把窗口定义为矩形,由上、下、左、右四条边围成。裁剪实质就是判断图形中那些点、线段、文字以及多边形是否落在窗口之内。
点的裁剪是最简单的一种,也是裁剪其他元素的基础。对于点P(x,y),只要判别两对不等式:
(2-20)
若不等式成立,点P(x,y)在窗口内,否则在窗口外。
从理论上讲,可以将图形离散成点,然后逐点判断各点是否满足上式,再利用逐点比较法裁剪任意复杂图形。裁剪算法的核心问题是速度,利用点的裁剪,裁剪速度太慢,没有实用价值。
三.直线段的裁剪
常用的线段裁剪方法有:Cohen_Sutherland裁剪算法、中点分割算法和参数化方法。这里介绍Cohen_Sutherland裁剪算法。主要介绍编码裁剪算法。
Cohen_Sutherland裁剪算法的基本思想是:对于线段P1P2分为三种情况处理。(1)若P1P2完全在窗口内,显示线段P1P2即“取”该线段;(2)若P1P2明显在窗口外,丢弃该线段P1P2;(3)若线段P1P2不满足上述两条件,则把线段P1P2分为两部分,其中一段完全在窗口外,丢弃该线段,然后对另一段重复上述处理。
计算机实现该算法时,将窗口边界延长,把平面分成9个区,每个区用四位二进制代码表示,如图2-15所示。四位编码中每位(按由右向左顺序)编码的意义如下:
图2-15 编码裁剪算法的区域分割
第一位,点在窗口左边界线之左为1,否则为0;
第二位,点在窗口右边界线之右为1,否则为0;
第三位,点在窗口下边界线之下为1,否则为0;
第四位,点在窗口上边界线之上为1,否则为0。
由上述编码规则可知:(1)如果两个端点的编码均为“0000”,则线段全部位于窗口内;(2)如果两个端点编码的位逻辑乘不为零,则整条线段必位于窗口外;(3)如果不满足上述两条件的线段,则必须再分割线段,计算出线段与窗口某一边界的交点,再利用上述两条件判别分割后的两条线段,从而舍弃位于窗口外的一段。
如如图2-16所示,线段P1P2两端点所在编码均不为零,但code1^code2=0,属于第三种情况。由code1=0001知P1在窗口左边。计算线段与窗口左边界交点P3。P1P3必在窗口外,舍弃之。对线段P3P2重复上述操作。由于P3的编码code3=0000,说明P3在窗口内,P2编码code2=0100,说明P2在窗口外。窗口下方,用窗口下边界与线段求交点P4,丢弃P4P2,剩下线段P4P3位于窗口内。
图 2-16 编码裁剪算法举例
四.多边形的裁剪
多边形是线段的集合,而且各线段依次连成一个封闭的折线,故它可看作一个具有封闭轮廓外形的二维图形。在对多边形的剪取过程中,不能仅仅对多边形的组成线段进行剪取,还要将窗口边界线上的适当部分添加到经剪取的可见线段中,以构成一个新的封闭多边形。
Sutherland-Hodgman(S-H)算法的思路是:将多边形的各边先相对于窗口的某一条边界进行裁剪,然后将裁剪结果再与另一条边界进行裁剪,如此重复多次,便可得到最终结果。
具体算法是:把整个多边形先相对于窗口的第一条边界线进行裁剪,即首先求出窗口的第一条边界线和多边形各边的交点,然后把这些交点按照一定的原则连成线段,与窗口的第一条边界线不相交的多边形其它部分保留,则可形成一个新的多边形;然后再把这个新的多边形相对于窗口的第二条边界线进行裁剪,再次形成一个新的多边形;接着用窗口的第三、第四条边界线依次进行裁剪,最后形成一个经过窗口的四条边界线裁剪后的多边形。
图2-17 逐次多边形栽剪算法的裁剪过程
|