本帖最后由 原地踏步 于 2024-1-1 13:08 编辑
下面简单介绍一下如何制作矢量字体,结合一个例子来说明。详细内容可参考1楼的pdf文件。
例子中网格尺寸为127×127,字符的大小也为127×127。
字符“咸” 的代码为: *53196,88,咸 7,1,8,(3,5),1,12,(14,39,16),12,(1,19,2),8,(0,38),8,(102,0),2,8,(-12,5),1,12, (-18,16,5),2,8,(-13,3),1,13,(6,-60,3),(14,-45,8),(9,-10,19),(9,3,61),(5,23,7), (0,0),2,8,(-12,48),1,12,(-45,-78,-24),2,8,(-29,18),1,9,(30,0),(0,32),(-30,0),(0, -32),(0,0),2,8,(-8,53),1,8,(47,0),7,2,0 以下依次说明: ★第一行: *53196:形编号,即字符“咸” 的十进制GBK码,以 “*” 开头。也可采用十六进制,十六进制编码前面要加0。同一个形定义文件中不能有重复的编号。 88:后续行中数据的字节数。每个逗号分隔着一个字节,数一下就知道了。每个形最多可有2000个字节。 咸:形名称,通常省略。 ★后续行: 形定义的数据,可为一行或多行,每行最多可包含128个字符。 代码7:绘制编号由下一个字节指定的子形。 数据1:由代码7指定的子形编号,必须位于当前的形定义文件中。可能为: *1,7 5,2,14,8,(-63,-127),0 也就是说,原数据也可写为(要去掉子形的结束符0): 5,2,14,8,(-63,-127),8,(3,5),1,12,(14,39,16),…… 代码5:将当前位置入栈,即保存当前坐标,后面不跟数据。由于此前没有任何位移,故当前坐标为原点(0,0)。 代码2:取消激活绘图模式(提笔),也就是笔悬空移动,不绘制。 代码14:只有当文字是垂直的,才会处理下一个命令,水平文字会自动忽略此代码。垂直文字一般仅起点和终点与水平文字不同,其余都是一样的。代码14放在此处,与代码8结合,用于确定垂直文字的起点。当字符不可书写垂直文字时,就不要使用代码14。 代码8:由后面两个数字指定 X-Y 的位移(不是坐标,位移换算成坐标值要与前面的坐标相加)。 数据 (-63,-127):由代码8指定的位移,即向X方向位移 -63,向Y方向位移-127。这就是垂直文字中下一个字符的起点。其中的括号不是必需的,只是为了阅读方便。建议书写时均加上括号。 数据8,(3,5),:与上一组数据类似,区别是代码14已结束了,此处的代码8用于水平文字。即从坐标 (0,0) 开始(代码14的位移在水平文字中被忽略),向X方向位移3,向Y方向位移5。从上图中可以看出,字符 “咸” 的起点坐标即为(3,5)。 代码1:激活绘图模式(落笔)。 代码12:绘制一段圆弧,后面跟三个数字。前两个数字的含义与代码8类似,分别代表X-Y方向的位移,第三个数字为凸度,其取值范围为-127~127,逆时针为正。凸度的计算公式为:(2*H/D)*127,可采用小数计算,但计算后得到的值应取整数。半圆的凸度为127(或-127),凸度为0时表示直线段。
形说明中的凸度与群码表中LWPOLYLINE的群码42代表的凸度计算方法类似,但多了一个系数,形的凸度=群码凸度×127。 数据“1,12,(14,39,16),12,(1,19,2),8,(0,38),8,(102,0),” 表示先绘制两段弧,再绘制两段直线,即“咸” 字中的 “厂”。该段数据也可写成: “1,12,(14,39,16),1,12,(1,19,2),1,8,(0,38),1,8,(102,0),” 很显然,这种写法的字节数较多。 数据2,8,(-12,5),1,12,(-18,16,5),2,8,(-13,3):抬笔位移,落笔绘制一段弧,即“咸” 字右上角的点,再抬笔位移。 代码13:与代码12类似,但可绘制多段圆弧,以 (0,0) 结束。注意 “(0,0)” 不能省略,不要以为加了括号,电脑就会知道你在什么时候结束。前面说过,括号反而是可以省略的。 数据“1,13,(6,-60,3),(14,-45,8),(9,-10,19),(9,3,61),(5,23,7),(0,0),”的含义为:落笔,连续绘制5段圆弧,即右侧的弯钩。 前面的代码“12,(14,39,16),12,(1,19,2),” 也可写为:“13,(14,39,16),(1,19,2),(0,0),” 同样,这种写法的字节数较多。很容易知道,当连续绘制3段弧时,代码12与代码13的字节数相同;超过3段时,使用代码13在字节数上就有优势了。 数据2,8,(-12,48),1,12,(-45,-78,-24),2,8,(-29,18):抬笔位移,落笔绘制一段弧,即“咸”字右侧的撇,再抬笔位移。 代码9:与代码8类似,但可绘制多段直线,以 (0,0) 结束。 数据“1,9,(30,0),(0,32),(-30,0),(0,-32),(0,0),” 的含义为:落笔,连续绘制4段直线,即下方的 “口”。 前面的数据“8,(0,38),8,(102,0),” 也可写为:“9,(0,38),(102,0),(0,0),”,但字节数较多。 数据2,8,(-8,53),1,8,(47,0):抬笔位移,落笔绘制一段直线,即“口”上面的一横。 数据7,2:引用编号为2的子形,子形必须位于当前的形定义文件中。编号2的定义可能为: *2,10 6,2,8,(127,0),14,8,(-127,-127),0 则原数据也可写为:……2,8,(-8,53),1,8,(47,0), 6,2,8,(127,0),14,8,(-127,-127),0 代码6:将当前位置出栈,即取出由前一个代码5储存的坐标。也就是说,无论此时坐标位于何处,均回到储存的坐标点上。代码5储存的坐标为(0,0),即当前的笔处于原点位置。 数据2,8,(127,0):抬笔向X方向位移127,为本字符的终点,也是下一个字符的起点。本字符起点与终点的距离,即为该字符的宽度。由于字符一般都不会写满,因此它的宽度也包含了空余部分。字符的最后一点通常都不是终点,每个字符的终点都需要专门定义。 数据14,8,(-127,-127):定义垂直文字的终点,不影响水平文字。 代码0:结束形定义。
|