矢量文本的生成及使用

上传人:平*** 文档编号:47591355 上传时间:2018-07-03 格式:PPT 页数:15 大小:72.14KB
返回 下载 相关 举报
矢量文本的生成及使用 _第1页
第1页 / 共15页
矢量文本的生成及使用 _第2页
第2页 / 共15页
矢量文本的生成及使用 _第3页
第3页 / 共15页
矢量文本的生成及使用 _第4页
第4页 / 共15页
矢量文本的生成及使用 _第5页
第5页 / 共15页
点击查看更多>>
资源描述

《矢量文本的生成及使用 》由会员分享,可在线阅读,更多相关《矢量文本的生成及使用 (15页珍藏版)》请在金锄头文库上搜索。

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度(从左上至右下)。 四个方向的笔划可分别

7、表示为: 水平方向: model(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

10、hz_idx_table / 索引文件结构 long int address; / 四字节长整形表示地址 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 字符颜色; 例中假定矢量文本库

13、为slhz.lib,其索引库为slhz.idx。void xshz(char *str, 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_

14、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 / 1

15、80; rotate = rotate * PI / 180; for (i=0; iaddress); /* 矢量文本库定位*/ x = x0 + i * dist * cos(direct); /* 单个汉字在屏幕上显示的首位置 */ y = y0 + i * dist * sin(direct); for (j=0; jline_num; j+) /* 按汉字笔划矢量数循环*/ fread(lib, 2, 1, fplib); /* 读取一对坐标*/ if (lib-x /* 为落笔时滤去落笔信息*/ PenDn = 1; else PenDn = 0; x11 = (float)lib-x / 72 * width

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号