矢量文本的生成及使用.ppt_第1页
矢量文本的生成及使用.ppt_第2页
矢量文本的生成及使用.ppt_第3页
矢量文本的生成及使用.ppt_第4页
矢量文本的生成及使用.ppt_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机图形学,中南大学国土与测绘系 主讲: 向南平 教授 E-mail: ,第7章 矢量文本的生成及使用,7.1 矢量文本概述 7.2 矢量文本的生成 7.3 矢量文本库的存储结构 7.4 矢量文本库的调用 7.5 专业矢量符号的生成,7.1 矢量文本概述,这里所说的文本,是指计算机图形软件中所用的中西文字符。 通常,在图形软件中用于文本显示和输出的方式有两种:其一是点阵方式,其二是矢量方式。点阵方式显示汉字在上一章已经介绍了,该方式显示汉字快速、简捷,是绝大多数文本编辑软件所采用的文本显示方式。但在图形软件中,使用点阵方式无法做到对文本作无级变倍放大或缩小,也很难做到对文本作任意角度的旋转变

2、换。只有矢量方式显示的文本才能轻易的完成这些在点阵方式下所不能或不易完成的工作。另一方面,点阵文本只能用于点阵打印机输出,而只有矢量文本才能用于绘图仪作高质量的图形输出。因此,任何一个成功的图形软件,无论它是用来处理中文还是西文,毫无例外都要用到矢量文本。唯一的差别在于,西文图形软件只需使用西文矢量文本,而中文图形软件不仅需要西文矢量文本,同时还需要有汉字矢量文本。 所谓矢量文本,就是用线段笔划表示的文字符号。矢量汉字就是由一组坐标定义的线段的集合。,7.1 矢量文本概述,建立矢量文本的方法很多,大体可分成两类:直接生成法和间接生成法。 1)直接生成法 顾名思义,就是借助某种图形定位设备,采用

3、一种“临帖”的方式,使定位设备(如光笔、数字化仪鼠标、键盘等)沿着字帖上汉字或符号的笔划边沿移动,并记下移动点的坐标,由此获取全部汉字及符号的笔划坐标。 采用这种方法,可以生成任何形体的矢量文本字库,只要有相应的文本字帖就行。采用该方法甚至可生成某些著名书法家的手笔。但这种方法对一般编程者是无法做到的,软件生产销售公司才有可能组织人力从事这项工作。 2)间接生成法 是指借助已有的字库(一般都是借助点阵字库),根据其提供的形体,通过软件的方式,将其转换为所需的矢量文本。这种方法的优点是,只要有点阵字库,就可以很快的生成相应形体的矢量文本。但这种方法也有其局限性,例如某些特殊形体的汉字(如魏碑、新

4、魏等)没有点阵文本,因此也就无法生成相应形体的矢量文本。,7.2 矢量文本的生成,7.2.1 矢量化原理 7.2.2 单点划线的点阵文本生成 7.2.3 由线段代替相邻点的搜索原则 7.2.4 矢量笔划的归并处理,7.2.1 矢量化原理,首先,假定待矢量化的点阵文本笔划宽度均是单点,进一步,我们将构成点阵文本笔划的点集中相邻点用线段代替。显然,表示一个汉字或符号的所有线段的总和,即构成了我们所需要的矢量化字符。这就是由点阵文本到矢量文本的基本生成原理。 从假设的前提可以看到,转换的关键在于: (1) 如何得到笔划宽度为单点的点阵文本; (2) 怎样完成由相邻点到线段的替代; 完成这两步后我们就

5、得到了一个最简单的矢量文本的雏形。由此得到的矢量汉字,平均每个汉字的笔划数在20以上。要使所生成的矢量文本美观实用,还得完成下述工作: (3) 将相接的且共线的笔划归并、修匀; (4) 对汉字的笔锋进行处理,使之适合于汉字的书写习惯。,7.2.2 单点划线的点阵文本生成,实际上汉字的16点阵文本本身就是单点划线的,但该文本的字形简单,且无字体之分。因此,一般仅用来生成简笔矢量字库,该字库主要用于图形中汉字及符号的注记。 高点字库(包括24点和40点阵字库)的笔划都不是单点划线的。因此,不满足我们的要求。然而,第六章介绍的空心点阵汉字,正好是我们需要的单点画线,且所有的笔划都是封闭的。利用它,可

6、获得美观的空心矢量汉字。 因此,前述空心点阵汉字的生成过程,也就是这里所要求的单点画线的点阵文本的生成过程。,7.2.3 由线段代替相邻点的搜索原则,这个过程是整个矢量化的关键,我们的要求是,不允许遗漏任何点,不允许笔划交叉。为此,我们先要找出点阵文本的笔划规则,再来确定整个点阵的搜索原则。 沿用6章第3节所得到的空心点阵汉字,并假定所得到的空心点阵字模存放在数组model7272中。这样,不难看出,单点划线的点阵文本的笔划方向,可归结为四个,即:水平(从左至右)、竖直(从上至下)、左下角45度(从右上至左下)、右下角45度(从左上至右下)。 四个方向的笔划可分别表示为: 水平方向:model

7、(I, J) - model(I+1, J); 竖直方向: model(I, J) - model(I, J+1); 左下方向: model(I, J) - model(I-1, J+1); 右下方向: model(I, J) - model(I+1, J+1);,7.2.4 矢量笔划的归并处理,根据上述框图原理生成的矢量汉字,其笔划还可以大量减化。例如,在一直线上的N个点,按上述方法可得到(N-1)条直线段,归并的目的就是要将这(N-1)条直线段合并成一条直线。 至于汉字笔划的修匀,主要是指汉字斜笔划(如撇、捺)上的锯齿的处理,以期得到光滑的曲线。汉字笔锋处理,则是指有锋字体(如宋体)的横起

8、笔、横收笔、竖起笔、竖收笔、横折、竖勾等笔锋的处理。,7.3 矢量文本库的存储结构,对于点阵汉字来说,不论汉字笔划繁简,也不论汉字形体如何,在同一种点阵字模库中,表示任何一个汉字的字节数是相同的。即,点阵汉字字模库是以定长方式来存储的。不同点阵的字模所用字节数我们在第六章已作了详细介绍。而矢量文本库则不同,因为矢量汉字是笔划汉字,而不同汉字的笔划数差异甚大,如果仍用定长方式存储矢量文本,则存储空间的冗余度太大,显然是不合理的。这里,我们介绍一种变长的索引存储方法。 所谓变长的索引存储,即在矢量文本库中连续存放全部汉字的笔划矢量,而用另一个索引文件存放每个汉字的笔划数及其在矢量文本库中的存储起始

9、地址。索引文件中汉字的排序是按汉字的区位顺序进行的。由于索引文件存放的仅是汉字的笔划数和首地址,因此,它可以设计成固定长度。若用两个字节表示每个汉字的笔划数,用四个字节表示其首地址,则在索引文件中可用六个字节存储一个汉字的信息。当我们需要获取某个汉字的矢量信息时,先根据汉字的机内码计算汉字的区位码,从而得到该汉字的区位顺序,由这个区位顺序在索引文件中对应找到该汉字的矢量笔划数及它在矢量文本库中的存放位置。再根据这两个参数从矢量文本库中获取汉字的笔划矢量。,7.3 矢量文本库的存储结构,索引文件及矢量文本的结构如下: struct hz_idx_table / 索引文件结构 long int a

10、ddress; / 四字节长整形表示地址 int line_num; / 两字节整形表示笔划数 struct hz_lib_table / 矢量文本结构 char x1, y1; / 两字节表示笔划起点坐标 char x2, y2; / 两字节表示笔划终点坐标 因为汉字点阵是24*24,即使纵横向各放大三倍,其点阵也不过为72*72,因此每一笔划起止点的坐标值(0-71)均可用一个单字节表示(一个单字节所能表示的最大数为256),这就是为什么上述文本库的结构中把坐标设置成字符型的原因。,7.3 矢量文本库的存储结构,但上述文本结构仍然还有一个缺陷,即相连的两个笔划重复一对坐标,按上述结构形成的

11、24点阵空心宋体矢量文本库长度为1925240字节。 为克服这个缺陷,改用龟图方式存储起落笔点坐标。其结构如下,龟笔的起落信息是存放在描述坐标的字节的第一个位上(用剩余的7个位可表示的最大数为127)。这样既实现了龟图方式的存储,又大大减化了存储信息。 struct hz_lib_table char x; / 该字节的第一位存放起落笔信息,剩余位存放X坐标 char y; / 该字节存放Y坐标 按上述结构存储的24点阵空心宋体矢量文本库长度为1225260字节。,7.4 矢量文本库的调用,矢量文本库的调用是这样进行的。首先,根据汉字的国标码计算该汉字的矢量信息在索引文件中的位置,从索引文件中

12、定位取出该汉字的矢量信息笔划数及其在矢量文本库中的起始地址,再据此在矢量文本库中定长取出汉字笔划矢量。当然,每取出一对坐标就得根据坐标中所携带的起落笔信息进行判断,以便确定本点是否与前一点相连。 最简单的调用矢量文本库的函数如下,其中各参数的意义为: str 待显示的字符串; x0,y0 指定字符串在屏幕上显示的起始位置; width 单个字符的宽度; height 单个字符的高度; direct 字符串的走向; rotate 字头的朝向; dist 字符间距; color 字符颜色; 例中假定矢量文本库为slhz.lib,其索引库为slhz.idx。,void xshz(char *str,

13、 char *style, float x0, float y0, float width, float height, float dist, float direct, float rotate, int color) int i, j, k=0; int PenDn, PenDnBefore; long int u; unsigned char qm, wm; float x1, y1, x, y, x11, X1, Y1, X2, Y2; FILE *fpidx, *fplib; struct hz_idx_table *idx; /* 声明一个库索引结构指针变量 */ struct hz_lib_table *lib; /* 声明一个库文件结构指针变量 */ idx = (struct hz_idx_table *)malloc(sizeof(struct hz_idx_table); lib = (struct hz_lib_table *)malloc(sizeof(struct hz_lib_table); fpidx= fopen(slhz.idx, rb); fplib= fopen(slhz.lib, rb); direct = direct * PI / 180; rotate = rotate *

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论