计算机图形学 学习笔记 二维观察

二维观察流水线

二维场景中要显示的部分称为裁剪窗口,所有在此区域之外的场景均要裁去。只有在裁剪窗口内部的场景才能显示在屏幕上。裁剪窗口有时暗指世界窗口或观察窗口。使用术语裁剪窗口来表示可能转换为监视器上某显示窗口的点阵的场景部分。图形系统还用称为视口的另一“窗口”来控制在显示窗口的定位。对象在裁剪窗口内的部分映射到显示窗口中指定位置的视口中。窗口选择要看什么,而视口指定在输出设备的什么位置进行观察。

通过改变视口的位置,可以在输出设备显示区域的不同位置观察物体。

场景的描述从二维世界坐标系到设备坐标系的映射称为二维观察变换。有时将二维观察变换简单地称为窗口到视口地变换或窗口变换。

为了使观察处理独立于输出设备,图形系统将对象描述转换到规范化设备坐标系并提供裁剪程序。有些系统的规范化设备坐标范围从0到1而另一些从-1到1。视口在规范化设备坐标系还是在设备坐标系中定义则取决于使用什么图形库。在观察变换的最后一步,视口中的内容转换到显示窗口的相应位置。

裁剪工作通常在规范化设备坐标系中进行。

裁剪窗口

应用程序要得到特殊的裁剪效果,可以通过选择裁剪窗口的不同形状,大小和方向来实现。

观察坐标系裁剪窗口

二维观察变换的一般方法是在世界坐标系中指定一个观察坐标系。以该坐标系为参考通过选定方向和位置来指定矩形裁剪窗口。

选择世界坐标系的某个位置P0 = (x0,y0)作为二维观察坐标系的原点,使世界坐标系的向量V作为观察坐标系yview轴的方向。向量V称为二维观察向上向量。

另一种方法是在世界坐标系上叠加观察坐标系。变换第一步是将观察坐标系原点移动到与世界坐标系原点重合。接着,旋转观察坐标系使其与世界坐标系重合。给定方向向量V,可为 yview和xview轴分别计算单位向量v(vx,vy)和u(ux , uy)。这两个向量用来形成观察坐标系xview    yview轴与世界坐标系 xw 和 yw 轴重合的旋转变换矩阵R的第一列和第二列。

对象在世界坐标系的位置随后由组合的二维变换矩阵转换到观察坐标系中:

T是观察坐标系原点与世界坐标系原点重合的平移变换,R是使平移后的观察坐标系与世界坐标系重合的旋转变换。

世界坐标系裁剪窗口

可以简单地在世界坐标系中将对象旋转(可能有平移)到所需位置并建立裁剪窗口。如图给出了变换三角形和所选裁剪窗口。

规范化和视口变换

有些图形系统将规范化和窗口-视口转换合并成一步。这样,视口坐标是从0到1,即视口位于一个单位正方形内。才建构包含视口地单位正方形映射到输出显示设备。在其他一些系统中,规范化和裁剪在窗口——视口转换之前进行。这些系统的视口边界在与显示窗口位置对应的屏幕坐标系指定。

裁剪窗口到规范化视口的映射

为了说明规范化和视口变换的一般过程,首先定义一个视口,其规范坐标值从0到1。按点的变换方式将对象描述变换到该视口。

为了保持视口与窗口中的对象具有同样的相对位置,必须满足:

对上述方程求解得:

其中,缩放系数为:

平移参数为:

该变换按下列顺序进行:

1.以点(xwmin,ywmin)为中心执行缩放变换,将窗口变换成视口的大小。

2.将(xwmin,ywmin)移到(xvmin,yvmin)。

第一步的缩放变换可以表示成二维矩阵:

裁剪窗口左下角平移到视口左下角的二维矩阵是:

变换到规范化视口的组合矩阵是:

窗口视口变换保持对象描述的相对位置。

另外只有才裁剪窗口和视口有相同的纵横比时才能保持对象的相对比例不变。

裁剪函数可使用裁剪窗口边界或视口边界实现裁剪。裁剪后,规范化坐标变换到设备坐标。单位正方形经过与窗口——视口变换相同的过程而映射到输出设备,其内部全部变换到输出设备的显示区域。

裁剪窗口到规范化正方形的映射

二维观察的另一种方法是先将裁剪窗口变换到规范化正方形,在规范化坐标系中进行裁剪,然后将场景描述变换到屏幕坐标系中指定的视口中。

裁剪窗口到规范化正方形的变换使用了与窗口——视口变换一样的过程。规范化变换的矩阵由式(8.8)中用-1带入xvmin和yvmin,用+1带入xvmax和yvmax而获得。

类似地,在裁剪操作完成后,边长为2的正方形变换到指定的视口。这时,在式(8.8)中用-1带入

xwmin和ywmin,用+1带入xwmax和ywmax而获得。

观察过程的最后一步是将视口在显示窗口中定位。

字符串的显示

通过观察流水线将字符串映射到视口的处理方法有两种。最简单的映射是保持字符串的大小不变,在使用点阵字体时通常采用这种方法。但轮廓线字体可以和其他图元一样变换,即只要对字形轮廓中线段的定义位置进行变换。

分画面效果和多输出设备

通过为一个场景选择不同的裁剪窗口及配对的视口,可同时显示两个或多个对象、多个图片部分或单个场景的不同观察。

在一个特定系统内同时使用两个或多个输出设备及为每个输出设备建立多对裁剪窗口 / 视口也是可以的。到所选输出设备的映射称为工作站变换。 

OpenGL二维观察函数

GLU库函数提供了指定二维裁剪窗口的函数,GLUT库函数提供了处理显示窗口的函数。可以使用这些二维函数及OpenGL观察函数进行所需的观察操作。

OpenGL投影模式

在选择OpenGL裁剪窗口和视口之前,必须建立合适的模式以便构建从世界坐标系到屏幕坐标系变换的矩阵。

可以使用在几何变换中设定建模观察模式的函数来设置投影模式。下列定义裁剪窗口和视口的函数将应用于投影矩阵。

将指定投影矩阵作为当前矩阵,它原来设定为单位矩阵。然而,如果要会过来获得场景的另一观察,则可以建立初始化:

这保证在每次进入投影模式时矩阵重新设定为单位矩阵。

GLU裁剪窗口函数

定义一个二维裁剪窗口使用下列函数:

OpenGL裁剪函数使用-1到1的规范化坐标范围。如果没有为应用程序指定裁剪窗口,就使用默认的坐标(-1, -1)和(1, 1)。这样,默认的裁剪窗口是以坐标系原点为中心,边长为2的规范化正方形。

OpenGL视口函数

这里的所有参数用对应于显示窗口的整数屏幕坐标给出。如果未使用glViewport,则默认的视口大小及位置与显示窗口一样。

OpenGL可以为各种应用建立多个视口。获取当前活动视口参数的查询函数是

建立GLUT显示窗口

由于GLUT库与任意窗口管理系统接口,使用GLUT子程序来建立和管理显示窗口可以使示例程序不依赖于特定的计算机。使用下列函数对GLUT子程序初始化:

有三个函数用来定义显示窗口并选择其尺寸及位置:

定义好的显示窗口在GLUT的setup操作完成前不会在屏幕上出现。

设定GLUT显示窗口的模式和颜色

显示窗口的参数由下列GLUT函数选择:

用来选择颜色模式(RGB或索引号)和不同的缓存组合。默认是单缓存和RGB(或RGBA)颜色模式。

显示窗口的背景颜色用下列OpenGL子程序在RGB模式中选择:

在颜色索引模式下,用

来设定显示窗口的颜色,这里的参数index被赋予与颜色表中的位置相对应的整数值。

GLUT显示窗口标识

在初始化一个显示窗口时,可以使用下列语句记录它的标识:

windowID就是显示窗口标识。

删除GLUT显示窗口

当前GLUT显示窗口

指定当前显示窗口

获取当前显示窗口

修改GLUT显示窗口的位置和大小

改变当前显示窗口的位置

设定当前显示窗口的尺寸

将当前显示窗口扩展到整个屏幕

glutFullScreen();

执行该函数后的显示窗口的实际尺寸取决于窗口管理系统。在这之后对glutPositionWindow或glutReshapeWindow的调用将取消扩展到整个屏幕的要求。

使用下列语句来调整显示窗口的变化:

这一GLUT函数在显示窗口的尺寸改变时被激活,新的宽和高将送给其所属变量:winReshapeFunc。可以使用这个回调函数来改变视口的参数从而保持场景原有的纵横比。

管理多个GLUT显示窗口

使用下列函数可将当前显示窗口变为一个图符,该图符通过小图片或符号形式来表示该窗口:

该图符将使用赋予该窗口的名字来标记,可以使用下列函数改变其名字:

可以用类似的命令改变显示窗口的名字:

当屏幕上打开多个显示窗口时,有些窗口可能部分或完全覆盖另外的窗口,可以通过先指定某个显示窗口为当前窗口,然后调用pop-window命令来使它成为所有其他窗口之前的窗口:

可以用类似的方法将当前显示窗口压到背后:

也可以让当前窗口从屏幕上消失或显示:

GLUT子窗口

可以在一个选中的显示窗口中建立任意数量的二级显示窗口,成为子窗口,这可用来将显示窗口分成不同的显示区域。创建子窗口的函数是:

不能将子窗口变为图符。

显示窗口屏幕光标形状的选择

在GLUT显示窗口中观察图形对象

创建多个显示窗口之后需要先指定哪个是当前显示窗口。然后引用下列函数来指定该窗口显示的内容:

pictureDescrip函数在GLUT确定应该更新显示窗口内容时执行。

如果显示窗口在重新显示过程中被破坏,则需要在glutPopWindow命令之后调用glutDisplayFunc。此时,使用下列函数来指出当前显示窗口的内容应该更新:

执行应用程序

启动程序执行,同时进入GLUT处理循环,反复查询从鼠标或数据板传来的交互输入等新事件。

其他GLUT函数

GLUT函数库提供各种依赖于系统的处理函数并为基本OpenGL库增加功能。

在没有其他事件需要系统处理时可以很方便地指定一个函数来运行。调用下列函数:

还有用于获得和处理交互输入及用于创建和管理菜单的GLUT函数。

使用下列函数来查询系统某些参数的当前值:

裁剪算法

一般情况下,任何用来消除指定区域内或区域外的图形部分的过程称为裁剪算法,简称裁剪

除非特别声明,都假设裁剪区域是一个正则矩形,其边界位于xwmin,xwmax,ymin,ymax。这些边界与x和y值的范围从0到1或从-1 到 1的规范化正方形的边界对应。

二维点裁剪

假设一点P(x,y)满足下列不等式,则保存该点用于显示:

二维线段裁剪

图8.9给出了线段的位置和标准矩形裁剪区域之间各种可能的关系:

线段裁剪算法通过一系列的测试和求交计算来判断是否整条线段或其中的某部分可以保存下来。线段与窗口边界的交点计算是线段裁剪函数的耗时部分。

通过上一节中的点裁剪测试来测试一线段是否完整地落在所指定地裁剪窗口的内部或外部。如果两个端点都在四条裁剪边界内,则线段完全在裁剪窗口内。如果一条线段的两个端点都在四条边界中任意一条边界的外侧,则该线段完全在裁剪窗口的外部。但如果上述都失败,则线段必定至少和一条边界相交,也许穿过也许不穿过裁剪窗口。

直线段可使用下列参数公式表示,其中坐标点(x0,y0)和(xend,yend)给出线段的两个端点:

通过将某一边界赋值给x或y,解出u值,便可确定线段与每一裁剪窗口边界的相交位置。如果u值在0到1之外,则线段与窗口边界不相交。但如果u值在0到1之内,就有部分线段位于该边界之内。再对位于内部的线段部分使用另一边界进行处理,直到线段不再有边界内的部分或找到窗口内的部分。

Cohen-Sutherland线段裁剪算法

该算法通过初始测试来减少交点计算,从而减少线段裁剪算法所用的时间。每条线段的端点都赋以区域码的四位二进制码,每一位用来标识端点相对于对应裁剪矩形边界的里面还是外面。

使用下列操作来更高效地确定区域码地值:

(1)计算端点坐标与裁剪边界的差。

(2)用各差值计算的符号位来设置区域码中相应的值。按图8.10中的顺序,位1设为x - xwmin的符号位;位2设置xwmax - x的符号位;位3设为 y - y wmin的符号位;位4设为ywmax - y的符号位。

一旦给所有的线段端点建立了区域码,完全在窗口边界内的线段,其两个端点的区域码均为0000。两个端点的区域码中,有一对相同位置都为1的线段则完全落在裁剪矩形之外。

测试线段是否在内部或外部的方法是对两个端点的区域码进行逻辑操作。如果两个端点的区域码进行逻辑“或”的结果位0000,则线段完全处于裁剪区域之内。如果两个端点的区域码进行逻辑“与”操作的结果是真,则线段完全位于裁剪区域之外。

对于不能完全判断为完全在窗口外或窗口内的线段,则要测试其与窗口边界的交点。要进行多次求交运算才能完成一条线段的裁剪,假定窗口边界的处理顺序如下:左、右、下、上。要检查某一线段是否与某裁剪边界相交,可以检查其两端点区域码的相应位。如果其中一个是1 而另一个是0,则线段与该边界相交。

如下所示,P1和P2的线段区域码是0100和1001。因此P1在左边界之内而P2在左边界之外。计算交点P2'并裁剪掉P2到P2'的部分。接下来检查下边界。端点P1在下裁剪边界之下而P2'在其上,因此求出在该边界上的交点P1'。再处理上边界,确定交点位置P2''。

线段与裁剪边界的交点计算可以使用斜截式的直线方程。对于端点坐标为(x0,y0)和(xend,yend)的直线段,与垂直边界交点的y坐标可以由下列等式计算得到:

x的值为xwmin或xwmax,线段的斜率根据 m = (yend - y0) / (xend - x0)进行计算。寻找与水平边界的交点时,其x坐标可以按下列等式进行计算:

其中,y设为ywmin或ywmax。

梁友栋-Barsky线段裁剪算法

梁友栋和Barsky分别提出了参数化线段裁剪的更快算法。

对端点为(x0,y0)和(xend,yend)的直线段,可以用参数形式描述:

其中,Δx = xend - x0、Δy = yend - y0。线段参数方程与点裁剪条件(8.12)结合,获得不等式:

这四个不等式可以表示为:

其中,p、q定义为:

任何平行于裁剪边界之一的直线 pk = 0,其中k对应于该裁剪边界(k = 1、2、3、4对应于左右下上边界)。如果还满足qk < 0,则线段完全在边界以外,因此舍弃该线段。如果qk > 0 ,则线段位于平行边界内。

当 pk < 0 时,线段从裁剪边界的延长线的外部延伸到内部。当pk > 0时,线段从裁剪边界的内部延伸到外部。当 pk != 0 时,可以计算出线段与边界k的延长线的交点 u 值:

对于每条直线,可以计算参数 u1和u2,它们定义了裁剪矩形内的线段部分。u1的值由线段从外到内遇到的矩形边界所决定(p < 0)。对于这些边界,计算 rk = qk / pk。u1取0 和各个r值中的最大值。 u2取1 和各个r值中的最小值。如果 u1 > u2,则线段完全落在裁剪窗口之外,因此将舍弃该线段。否则,由参数u的两个值计算出裁剪后的线段端点。

Nicholl-Lee-Nicholl 线段裁剪算法

NLN算法通过在裁剪窗口边界创立多个区域,从而避免对一个直线段进行多次裁剪。仅仅用于二维裁剪。

确定一条线段完全在裁剪窗口内部或外部的初始测试可以像前面两个算法一样用区域码测试来完成。如果一条线段不能明确接受或拒绝,则NLN算法进一步建立另外的裁剪区域。

对于端点为P0和Pend的线段,首先确定P0相对于裁剪矩形九个可能区域的位置。只要考虑三个区域即可,其他六个位置可以利用对称变换将其变换到这三个区域中的一个。

假定P0和Pend不同时在裁剪窗口的内部,下一步判断Pend相对于P0的位置。为此,根据P0位置在平面上创立新的区域,新区域边界以P0为起始点、穿过窗口的顶点的射线。

如果P0在裁剪窗口之内,Pend在窗口外,就设置四个区域。

如果P0位于窗口的左边区域,则设定四个区域:L、LT、LR和LB。

对于第三种情况,当P0在裁剪窗口的左上方时,采用图8.17所示的裁剪区域。在这种情况下,根据P0相对于窗口左上角的位置,有两种可能。

为了确定Pend位于哪一个区域,要比较该线段的斜率和裁剪区域边界的斜率。例如,如果P0在裁剪边界的左边,并且满足下列条件,则Pend在区域LT中,

如果满足下列条件则舍弃整条直线:

在斜率测试中的坐标差值和计算结果将被存储,可以用于以后进行求交计算。参数方程

与窗口左边界的交点的x位置是 x = xL,而且 u = ( xL - x0 ) / ( xend - x0 ),所以交点的y位置是:

并且与窗口顶部边界的交点是 y = yr,而且 u = ( yr - y0 ) / ( yend - y0 ),因此:

非矩形多边形裁剪窗口的线段裁剪

在某些应用中,需要使用任意形状的多边形多线段进行裁剪。基于参数化直线方程的算法,如Cyrus-Beck算法或梁友栋-Barsky算法,都可以扩充到凸多边形窗口。

对于凹多边形,可以使用4.7节所述方法将它分解为一组凸多边形后再使用参数化裁剪算法。另一种方法是添加一些边使凹裁剪区域称为凸裁剪区域。然后使用修改后的凸多边形组对线段进行一系列裁剪操作。

非线性裁剪窗口边界的线段裁剪

可以使用圆或其他曲线边界进行裁剪,首先由曲线裁剪区域的包围矩形对线段进行裁剪。完全落在包围矩形之外的线段将被舍弃。通过计算圆心到线段端点的距离,以识别出内部线段。如果线段的两端点到圆心距离的平方小于等于半径的平方,则存储整条线段。其他线段则通过求解圆——直线联立方程来计算交点。

多边形填充区裁剪

为了裁剪一个填充多边形,不能直接使用线段裁剪算法对多边形的每一条边进行裁剪,因为该方法一般不能生成封闭的折线。使用线段裁剪进行处理的多边形边界将显示为一系列不连接的线段,并且没有关于如何形成裁剪后的封闭边界的完整信息。

正如先前测试一条线段是否完全保存或完全裁剪掉一样,对多边形填充区也进行坐标范围的测试。如果填充区的最小、最大坐标值被保存,留待进一步处理。如果这些坐标范围位于任意一条裁剪边界的外部,则将该多边形从场景中清除。

在不能确定一个填充区完全在裁剪窗口内部或外部时,需要定位多边形与裁剪窗口的交点。实现凸多边形裁剪的一种方法是为每一条裁剪边界建立一个新的顶点队列,并将其传递给下一边界。最后一次裁剪的输出就是定义裁剪后的多边形的顶点队列。

Sutherland-Hodgman多边形裁剪

将多边形顶点依次传递给每一裁剪阶段,每一个裁剪后的顶点可立即传递给下一阶段。这取消了每一裁剪阶段对成组顶点的需求,从而允许边界裁剪子程序并行地执行。最终地输出是描述裁剪后地多边形填充区边界地顶点队列。

这一方法的总体策略是顺序地将每一多边形段的一对顶点送给一组裁剪器(左右下上)。一个裁剪器完成一对顶点的处理后,该边裁剪后留下的坐标值立即送给下一个裁剪器。然后第一个裁剪器处理下一对端点。

在用裁剪边界对多边形的边裁剪时有四种情况需要考虑。一种可能是多边形边的第一端点在裁剪边界外部而第二端点在内部。或两个端点都在裁剪边界内部。另一种可能是第一端点在裁剪边界的内部而第二端点在外部。最后一种可能,即两个端点都在裁剪边界外部。

按下列测试结果为下一裁剪器生成输出:

这一组裁剪器最后一个生成的顶点队列用来描述最终裁剪后的填充区。

Weiler-Atherton多边形裁剪

这个算法是一种通用的多边形裁剪方法,因而可用于裁剪凸多边形或凹多边形。

对于逆时针的多边形填充顶点顺序,可应用下列过程:

1.按逆时针方向处理多边形填充区,直到一对内 ——外顶点与某裁剪边界相遇,即多边形边的第一顶点在裁剪窗口内而第二顶点在裁剪窗口外。

2.在窗口边界上从“出”交点沿逆时针方向到达另一个与多边形的交点。如该点是处理边的点,则走向下一步。如果是新交点,则继续按逆时针方向处理多边形直到遇见已经处理的顶点。

3.形成裁剪后该区域的顶点队列。

4.回到“出”交点并继续按逆时针处理多边形的边。

非矩形的多边形窗口的多边形裁剪

梁友栋-Barsky算法和其他参数化线段裁剪算法特别适用于处理用凸多边形裁剪窗口区裁剪填充区。

可以通过Weiler-Atherton算法中的边遍历方法用任意多边形裁剪窗口(凸或凹多边形)来处理任意多边形填充区。这种情况下需要如填充区的顶点队列一样按逆时针(或顺时针)方向维护一个裁剪窗口的顶点队列。还需要使用内——外测试来确定填充区顶点是在特定裁剪窗口的边界之内还是之外。实际上,定位一个填充区的裁剪后的区域等价于确定两平面区域的交。

非线性裁剪窗口边界的多边形裁剪

处理用曲线边界裁剪窗口的一种方法是先用直线段逼近边界,然后用一般的多边形裁剪窗口的裁剪算法对其进行处理。可以使用线段裁剪中讨论的通用算法。首先,比较填充区与裁剪窗口的坐标范围。根据裁剪窗口的形状,可能进行其他一些基于对称考虑的区域测试。对于那些不能确认完全在裁剪窗口内部或外部的填充区,都要计算窗口与填充区的相交位置。

曲线的裁剪

曲线的裁剪过程涉及非线性方程,与线性边界的区域处理相比,需要更多的处理。

可以先测试对象与裁剪窗口的坐标范围来确定是否可以简单地接受或拒绝整个对象,如果不能,则再检查对称性来确定是否可以简单地接受或拒绝。

计算交点时要将裁剪边界位置带入对象边界地非线性方程并解其他坐标值。交点位置求得后,对象的定义位置则可存储以便在扫描转换过程中使用。

利用一般的多边形裁剪窗口对曲线对象的裁剪可以使用类似的方法。第一轮,比较对象包围矩形和裁剪窗口的包围盒。如果不能保存或排除整个对象,则接着求解直线——曲线联立方程来确定裁剪交点。

文字的裁剪

使用窗口边界处理字符串的最简单的方法,是如图8.31所示的全部保留或全部舍弃字符串的裁剪策略。这种方法通过测试字符串的坐标范围来实现。

另一种是使用全部保留或全部舍弃字符的策略。这里仅仅舍弃没有完全落在裁剪窗口内的字符。在这种情况下,每一个字符的边界要与窗口进行比较。任何没有完全落在裁剪窗口内的字符都将被裁剪。

第三种方法是裁剪单个字符的组成部分。使用了与线段裁剪的相同方法对字符进行裁剪。如果一个字符与裁剪窗口边界有重叠,则裁剪掉位于窗口之外的字符部分。由线段构成的轮廓字体可以使用线段裁剪算法进行处理。而使用位图定义的字符,则通过比较字符点阵中的各个像素关于裁剪边界的相对位置而进行裁剪。

小结

二维观察变换流水线是将在xy平面上定义的世界坐标系图形显示出来的一系列操作。在构造场景后,它被映射到观察坐标系,再到规范化坐标系去裁剪。最后,场景变换到设备坐标系显示。规范化坐标系取值范围为0到1或从-1到1,它使图形软件包不依赖于具体的输出设备。

用裁剪窗口选择场景的一部分在输出设备上显示,裁剪窗口在世界坐标系或与之相关的观察坐标系中描述。裁剪窗口中的内容变换到输出设备的视口去显示。在有些系统中,视口在规范化坐标系中指定。其他系统则在设备坐标系中指定。一般情况下,裁剪窗口和视口是标准位置的矩形,其边界平行于坐标轴。对象映射到视口后,其在视口中的相对位置与其在裁剪窗口中的相对位置一样。为了保持对象的比例,视口与对应的裁剪窗口必须具有相同的纵横比。对同一场景可以建立任意数量的裁剪窗口和视口。

裁剪算法通常在规范化坐标系中执行,因此所有不依赖于设备坐标系的几何变换和观察变换都可以合并到一个变换矩阵。使用在设备坐标系中指定的视口时,可在将规范化、对称正方形中的内容变换到视口之前,使用规范化的、对称的、其坐标范围从-1到1的正方形来裁剪二维场景。

Cohen和Sutherland提出了使用区域标识线段端点相对于裁剪窗口边界位置的裁剪算法。端点区域码用来快速确认那些完全在裁剪窗口内部或外部的线段。对余下的线段必须计算边界上的交点位置。梁友栋和Barsky提出了用参数方程表示线段的快速线段裁剪算法。Nicholl-Lee-Nicholl算法通过在xy平面上使用更多的区域测试而进一步减少了求交操作,但仅用于二维线段裁剪。

多边形裁剪算法,在Sutherland-Hodgman算法中,填充区的一堆顶点经由每个边界裁剪器处理,获得的边裁剪信息立即传递给下一裁剪例程。Weiler-Atherton算法使用边界遍历方法,对凸多边形和凹多边形都能正确地裁剪。

全部保留或全部舍弃策略是最快速的文字裁剪方法。最精确的文字裁剪方法是使用点、线段、多边形或曲线等裁剪算法对字符串中的每一字符按其由点阵还是轮廓方式定义来裁剪。

 

猜你喜欢

转载自blog.csdn.net/dmk17771552304/article/details/118093983