点的属性
一般情况下,我们可以设定点的两个属性:颜色和大小。在一个描述系统中,点的显示颜色和大小由存放在属性表中的当前值确定。颜色分量用RGB值或指向颜色表的索引值设定。对于光栅系统而言,点的大小是像素大小的一个整倍数,因此一个大的点显示成一个像素方块。
线的属性
直线段可以使用三个基本属性来显示:颜色、线宽和线型。线的颜色用对所有图元相同的函数进行设定,而线宽和线型则用单独的线函数选择。另外,线还可生成如画笔和笔刷等其他效果。
线宽
线宽选择的实现取决于输出设备的能力。在视频监视器上的粗线可以用相邻的平行线进行显示,而在笔式绘图仪上则可能需要更换画笔来绘制粗线。
在光栅实现中,类似于Bresenham算法,通过在每个采样位置处使用一个像素来生成标准线宽。其他线宽则是作为标准线的正整数倍,通过沿相邻平行线路径绘制额外的像素而显示的。对于斜率绝对值小于1.0的直线,可以修改画线程序,通过在沿线的每个列(x位置)绘制像素的垂直段来显示粗线。每段的像素数目等于线段的整数值。在图4.2中,我们通过在原线路径上面生成一条平行线而画出了双倍线宽的直线。在每个取样位置x处,计算对应的y坐标并用屏幕坐标(x,y)和(x, y+l)绘制像素。通过交替地在单宽度线路径上下绘制像素,可以显示宽度为3或更宽的直线段。
对于斜率绝对值大于1.0的直线,可以交替地选择线段路径左边和右边的像素以形成水平段来显示粗线。图4.3示例了这个方法,其线宽为4,使用水平像素段进行绘制。类似地,斜率小于或等于1.0的粗线可以用垂直段显示。通过比较线端点水平方向和垂直方向的分离程度(△x和△y),可以实现这一过程。如果|△x| >= |△y|,则像素在垂直方向重复。否则,在每一行画出多个像素。
尽管绘制水平或垂直段的方法可以快速地生成粗线,但是显示的线宽(在线路径垂直方向测量)依赖于它的斜率。45°线的宽度是用等长像素段绘制的水平或垂直线条宽度的1/√2。使用水平或垂直像素段实现宽度选择的另一个问题是:无论斜率大小,所生成直线的端点是水平的或是垂直的。这对于较粗的直线的影响则更为突出。我们可以通过添加线帽(line cap)来调整线端的形状,从而给出更好的外观(参见图4.4 )。线帽的一种形式是方帽(butt cap),这种形式通过调整所构成的平行线的端点位置,使粗线的显示具有垂直于线路径的方端。假如指定直线的斜率为m,那么粗线的方端的斜率为-1/m。另一种线帽是圆帽(round cap),这种形式通过对每个方帽添加一个填充的半圆而得到。圆弧的圆心在线段的端点,其直径与直线宽度相等。第三种线帽是突方帽(projecting square cap)。这里,我们简单地将线段向两头延伸一半线宽并添加方帽。
生成粗线的其他方法包括将显示线段看做填充的矩形,或用选定的画笔和笔刷图案来生成线段,这些内容将在下一节讨论。为了得到线段边界的矩形表示,可以沿垂直于线路径方向计算矩形顶点的位置,从而使顶点坐标与线段端点的距离为线宽的一半。那么,矩形线就可以显示为图4.4(a)。然后,可以给填充的矩形添加圆帽或延伸其长度来显示突方帽。
生成粗折线需要一些额外的考虑。通常,显示单根线段所用的方法不能生成平滑连接的一系列线段。例如,使用水平或垂直像素段显示粗线,会在不同斜率的线段的连接处,其水平段变成垂直段时留下间隙。我们可以通过在线段端点进行额外的处理来生成平滑连接的粗折线。图4.5给出了两线段平滑连接的三种可能方法。斜角连接(miter join)通过延伸两条线的外边界直到它们相交而形成;圆连接(round join)通过使用直径等于线宽的圆弧边界将两线段连接而形成;斜切连接(bevel join)则是通过使用方帽并在两线段相交处的三角形间隙中进行填充而形成。假如两连接线段间的夹角很小,斜角连接会产生一个较长的尖峰而使折线变形。图形软件包可以在任何连接的两线段于足够小的角度相交时,切换到斜切连接来避免这种情况。
一般情况下,我们可以设定点的两个属性:颜色和大小。在一个描述系统中,点的显示颜色和大小由存放在属性表中的当前值确定。颜色分量用RGB值或指向颜色表的索引值设定。对于光栅系统而言,点的大小是像素大小的一个整倍数,因此一个大的点显示成一个像素方块。
线的属性
直线段可以使用三个基本属性来显示:颜色、线宽和线型。线的颜色用对所有图元相同的函数进行设定,而线宽和线型则用单独的线函数选择。另外,线还可生成如画笔和笔刷等其他效果。
线宽
线宽选择的实现取决于输出设备的能力。在视频监视器上的粗线可以用相邻的平行线进行显示,而在笔式绘图仪上则可能需要更换画笔来绘制粗线。
在光栅实现中,类似于Bresenham算法,通过在每个采样位置处使用一个像素来生成标准线宽。其他线宽则是作为标准线的正整数倍,通过沿相邻平行线路径绘制额外的像素而显示的。对于斜率绝对值小于1.0的直线,可以修改画线程序,通过在沿线的每个列(x位置)绘制像素的垂直段来显示粗线。每段的像素数目等于线段的整数值。在图4.2中,我们通过在原线路径上面生成一条平行线而画出了双倍线宽的直线。在每个取样位置x处,计算对应的y坐标并用屏幕坐标(x,y)和(x, y+l)绘制像素。通过交替地在单宽度线路径上下绘制像素,可以显示宽度为3或更宽的直线段。
生成粗线的其他方法包括将显示线段看做填充的矩形,或用选定的画笔和笔刷图案来生成线段,这些内容将在下一节讨论。为了得到线段边界的矩形表示,可以沿垂直于线路径方向计算矩形顶点的位置,从而使顶点坐标与线段端点的距离为线宽的一半。那么,矩形线就可以显示为图4.4(a)。然后,可以给填充的矩形添加圆帽或延伸其长度来显示突方帽。
生成粗折线需要一些额外的考虑。通常,显示单根线段所用的方法不能生成平滑连接的一系列线段。例如,使用水平或垂直像素段显示粗线,会在不同斜率的线段的连接处,其水平段变成垂直段时留下间隙。我们可以通过在线段端点进行额外的处理来生成平滑连接的粗折线。图4.5给出了两线段平滑连接的三种可能方法。斜角连接(miter join)通过延伸两条线的外边界直到它们相交而形成;圆连接(round join)通过使用直径等于线宽的圆弧边界将两线段连接而形成;斜切连接(bevel join)则是通过使用方帽并在两线段相交处的三角形间隙中进行填充而形成。假如两连接线段间的夹角很小,斜角连接会产生一个较长的尖峰而使折线变形。图形软件包可以在任何连接的两线段于足够小的角度相交时,切换到斜切连接来避免这种情况。