计算机图形学字符
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.矢量字符的端点存储方式
(1)定义字符:首先在局部坐标系下写字模(如图 3-43所示),然后确定字符代码、字符各笔划坐标、 划线标志(例如0为移动、1为画线、2为画曲线,且 各笔划坐标不等于这三个值)和结束标志(-1)等。
如图3-43所示,从原点开始,移到a(10,10),画
线到b(10,110),画线到c(60,110),画曲线到
(3)曲线笔划的绘制
对于移动与绘制直线比较简单,而对于过三点绘 制曲线,可使用二次参数曲线(抛物线)。设二 次参数曲线方程为:
x(t)=axt2+bxt+cx y(t)=ayt2+byt+cy
已知过抛物线三个点坐标(x1,y1),(x2,y2),(x3,y3),其中 第1个点是抛物线的起点,第3个点是抛物线的终点, 则根据三个点的坐标值,可推出上式的六个系数:
图3-41 点阵字符
图3-42 字符的矩阵点阵
2.点阵字符的显示
从字库中将它的位图检索出来,将检索到的位图信 息写到帧缓冲器中或通过画点将字符写出来。假设一个 字符的点阵信息存在数组中,显示该字符的部分程序
CDC *pDC=GetDC(); byte r[8]={0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00}; for(y=0;y<=7;y++) { for(x=0;x<=7;x++)
3.4 字 符
字符指数字、字母、汉字等符号。计算机中字符 由一个数字编码惟一标识。为了在显示器等输出 设备上输出字符,系统中必须装备有相应的字库。 字库中存储了每个字符的形状信息,字库分为矢 量字符和点阵字符两种。
3.4.1 点阵字符
1.点阵字符的存储
点阵字符将字符形状表示为一个矩形点阵,点阵 中值为1表示字符的笔画经过此位,对应于此位的像 素应置为字符颜色;点阵中值为0表示字符的笔画不 经过此位,对应于此位的像素应置为背景颜色。常用 的点阵大小有5×7,8×8,16×16等,
ax=2(x3-2x2+ x1) bx=4x2-x3-3x1 cx=x1
ay=2(y3-2y2+ y1) by=4y2-y3-3y1 cy=y1
(4)矢量字库的显示。
设矢量字的笔划存在数组中,字符显示的主要VC程序:
CDC *pDC=GetDC(); int bh[]={0,10,10,1,10,110,1,60,110,2, 60,110,80,85,60,60, 2, 60,60,80,35,60,10,1,10,10,0,10,60,1,60,60,-1},i=0; while(bh[i]!=-1) { if(bh[i]==0) pDC->MoveTo(bh[i+1]+x0,bh[i+2]+y0),i=i+3;
}
elseຫໍສະໝຸດ Baiduif(bh[i]==1) pDC->LineTo(bh[i+1]+x0,bh[i+2]+y0),i=i+3; else if(bh[i]==2) //画曲线
{ ax=2.0*(bh[i+5]-2*bh[i+3]+bh[i+1]); ay=2.0*(bh[i+6]-2*bh[i+4]+bh[i+2]); bx=4.0*bh[i+3]-bh[i+5]-3*bh[i+1]; by=4.0*bh[i+4]-bh[i+6]-3*bh[i+2]; cx= bh[i+1]; cy= bh[i+2]; pDC->MoveTo(bh[i+1]+x0,bh[i+2]+y0); for(t=0.05;t<=1.0001;t=t+0.05) //绘制过已知三点的抛物线 {x=ax*t*t+bx*t+cx; y=ay*t*t+by*t+cy; pDC->LineTo(x+x0,ye+y0); } i=i+7; }
m+1以后的字节存放每个字符的笔划,一个坐标值 或一个标志占一个字节。
例如:存放A与B两个矢量字符笔划时,字库内容如下:
65,1,66,17,…
0,10,100,1,50,10,1,100,100,0,30,55,1,75,55,-1,
0,10,10,1,10,110,1,60,110,2, 60,110,80,85,60,60,2, 60,60,80,35,60,10,1,10,10,0,10,60,1,60,60,-1
a
e
0
图3-43 矢量字符B的笔划
(2)矢量字库的存储。在矢量字符库中,要存放 许多矢量字的笔划,因此必须对每个字符进行编 码,并且要记录每个字符的起始位置,因此矢量 字库的文件结构可设计如下:
0-m字节为文件头,主要存放每个字符的编码(2 个字节)与笔划坐标起始位置(2个字节),m的 取值取决于字库中应存的最大字符个数。
{ d=1<<(7-x); if((r[y] & d)= =d) //获取字符点位信息
pDC->SetPixel (x+x0,y+y0,RGB(0,0,0)); } }
3.4.2 矢量字符
矢量字符记录字符的笔画信息而不是整个位图, 它具有存储空间小、美观、变换方便等优点。对于字 符的旋转、缩放等变换,点阵字符的变换需要对表示 字符位图中的每一像素进行;而矢量字符的变换只要 对其笔画端点进行变换就可以了。
d(60,60)[中间控制点为(80,85)],画曲线到e
(60,10)[中间控制点为(80,35)],画直线到a
(10,10),移到f(10,60),画线到d(60,60),
结束。
b
c
矢量字B的存储内容如下:
0,10,10,1,10,110,1,60,110,2,
f d
80,85,60,60,2,80,35,60,10,1, 10,10,0,10,60,1,60,60,-1
以8×8点阵字符为例,1个B字符的点阵信息如图3-41所
示,其矩阵点阵值如图3-42所示,占8个字节,其相应的
十六进制数为FC66667C6666FC00。字符一般是以ASCII
值的顺序存储的,如字符B的ASCII码值为66,则在字符
库中的起始字节位置为65×8+1。
11111100 01100110 01100110 01111100 01100110 01100110 11111100 00000000