矢量图形
矢量图形是计算机图形学中用点、直线或者多边形等基于数学方程的几何图元表示图像。矢量图形与位图使用像素表示图像的方法有所不同。
特点(1)文件小。由于图形中保存的是线条和图块的信息,因此矢量图形文件和分辨率和图形大小无关,只与图形的复杂程度有关,简单图形所占的存储空间小。
(2)图形大小可以无级缩放。在图形进行缩放、旋转或变形操作时,图形仍具有很高的显示和印刷质量,而且不会产生锯齿模糊效果。
(3)可采取高分辨率印刷。矢量图形文件可以在任何输出设备及打印机上以打印或印刷机的最高分辨率进行打印输出。
综述所有的现代计算机显示器都要将矢量图形转换成栅格图像的格式,包含屏幕上每个像素数值的栅格图像保存在内存中。
从计算机发展的最初1950年代一直到1980年代,曾经使用过一种不同类型的矢量图形系统显示器。在这些系统中 CRT 显示器的电子束直接逐段生成所需图形,屏幕其它部分保持为黑的状态。为了达到没有闪烁或者接近没有闪烁的效果,这个过程每秒要重复很多次。这种显示系统可以生成分辨率非常高的艺术线条,并且不需要栅格系统生成同样分辨率所需要的对于当时来说非常巨大的内存空间。这种基于矢量的显示器称为 X-Y显示器。
矢量化是去除照片中多余信息的好方法。(为了在本页显示图像转成了 JPEG 格式)
原始照片,JPEG 栅格图像
矢量化的 Steam Locomotive 7646,最初是 Windows Metafile 格式(为了在本页显示转成了 GIF 格式)。矢量图形显示器的最初应用之一是 US SAGE 防空系统。矢量图形系统只有在 1999年 美国的空管中出现过故障,现在依然在军队以及一些特殊系统中使用。另外,1963年 计算机图形学先驱 Ivan Sutherland 在 MIT Lincoln Laboratory 的 TX-2 上使用矢量系统运行他的 Sketchpad 程序。
后来的矢量图形系统包括 Digital 的 GT40 [1]。有一个名为 Vectrex 的家庭游戏系统使用了矢量图形,另外还有 Asteroids 以及 Space Wars 这样的游乐中心游戏也使用了矢量图形。另外值得一提的是 Tektronix 4014,尽管它的显示是静态的。
如今矢量图形这个术语主要用于二维计算机图形学领域。它是艺术家能够在栅格显示器上生成图像的几种方式之一。另外几种方式包括文本、多媒体以及三维渲染。实质上来说,所有当今的三维渲染都是二维矢量图形技术的扩展。工程制图领域的绘图仪仍然直接在图纸上绘制矢量图形。
目的例如,程序绘制一个半径为 r 的圆所需的主要信息是:
半径 r
圆心坐标
画笔样式与颜色(可能是透明)
填充样式与颜色(可能是透明)
这种绘制图比位图的优越之处有:
保存最少的信息,文件大小比位图要小,并且文件大小与物体的大小无关
可以无限地放大这个圆,它仍然保持平滑;用多边形表示的曲线将会显现出不是真正的曲线
在放大的时候,直线与曲线都不会成比例地变粗,它只会保持不变或者要小于缩放比例;为了看起来比较平滑,使用简单几何形状表示的不规则曲线将会成比例地变粗,并且看起来不再像这些几何形状
保存的物体参数可以在后面修改。这也就是说物体的运动、缩放、旋转、填充等都不会降低绘制的精度。另外,可以用与设备无关的单位表示,这样更好地栅格设备上进行栅格化。
从三维的视角来看,由于阴影可以抽象为形成它们的光线,所以矢量图形的阴影渲染更加真实。这样就可以得到真实感的图像及渲染效果。
典型的图元对象
直线与多义线
多边形
圆与椭圆
贝塞尔曲线
贝塞尔样条
文本 (如TrueType这样的计算机字体,每个字符都是贝塞尔曲线绘制的)
这只是其中的一部分,另外还有各种各样用于不同应用程序的曲线,如 Catmull-Rom 样条、非均匀有理B样条 等。
通常位图图像也是一个元对象,从概念上来看它同矩形的表现类似。
矢量运算矢量图形编辑器通常可以旋转、平移、镜像、拉伸、扭曲矢量图形,通常可以进行仿射变换,改变深度位置并且将图元与复杂物体合并。 更加复杂的变换包括封闭形状的集合运算(并集、补集、交集等)。
矢量图形非常适合于与设备无关的简单或者合成的制图或者不需要实现真实感的场合。例如,PostScript以及PDF的页面描述语言就使用了矢量图形模型。
打印矢量艺术线条是打印领域中的一项关键技术。因为艺术线条是从一系列数学点得到的,所以无论如何缩放艺术线条打印结果质量都非常高。例如,将同一个矢量标识图打印到名片上或者放大到广告牌上,都可以得到同样的图像质量。与此不同的是,如果位图从名片大小放大到广告版的尺寸,那么图像质量将会变得非常模糊。
三维造型在三维计算机图形学中,矢量表面表示非常常见,而位图可以用作表面纹理、高度场数据以及凸凹纹理映射等特殊目的。在低端系统中,在应用程序中用简单的多边形网格表示几何细节,在这些场合交互帧率或者简单性都是非常重要的。在高端系统中,如果希望通过牺牲渲染时间的方法换取更好的图像质量及精度,那么就可以使用贝塞尔曲面、NURBS或者子分曲面等平滑表示方法。但是,我们也可以用 Phong shading 这样的算法从多边形网格实现一个平滑曲面。[1]