4.2字符的生成算法

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

4.3文字的生成技术常用的方法有:•点阵式pDotText•矢量式pShiLiangText•编码式directText点阵式字符DEF:每个字符都定义成一个称为掩膜的矩阵。矩阵中的元素都是一位二进制数,当该位为1时,表示字符的笔划经过此位,对应于此位的象素应置为字符颜色;当该位为0时,表示字符的笔划不经过此位,对应于此位的象素应置为背景色或不改变。00000000000000000001111111110000000110000001100000011000000011000001100000001100000110000001100000011000011000000001111111000000000110000000000000011000000000000001100000000000000110000000000000000000000000000000000000000000当该位为1时,表示字符的笔划经过此位当该位为0时,表示字符的笔划不经过此位P-DotText掩膜的矩阵(16×16)程序如何实现点阵法字符输出?两个问题(1)如何表示掩膜的矩阵?(2)如何确定各个位是1还是0Int(16位)InttextP[16]={ox0000,0x0000,0x1FF0,0x1818,……0x0000}0000000000000000000000000000000000011111111100000001100000011000000110000000110000011000000011000001100000011000000110000110000000011111110000000001100000000000000110000000000000011000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000011111111100000001100000011000000110000000110000011000000011000001100000011000000110000110000000011111110000000001100000000000000110000000000000011000000000000001100000000000000000000000000000000000000000000000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000100000000000000000010000000000000000001000000000000000000100000000000000000010000000000000000001Text[16]mask[16]如何判断字模中各个位的子呢?voiddisplayText(intx0,inty0,intText[],intcolor){inti,j;for(i=0;i16;i++){//行for(j=0;j16;j++){//列}}}if((Text[i]&mask[j])!=0)putpixel(x0+j,y0+i,color);inttext[16]={0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};intmask[16]={0x8000,0x4000,0x2000,0x1000,0x0800,0x0400,0x0200,0x0100,0x0080,0x0040,0x0020,0x0010,0x0008,0x0004,0x0002,0x0001}点阵式字符时主要的文字表示形式。常用的点阵大小有5×7、7×9、8×8、16×16等等当点阵变大时,字型可以做得非常漂亮。优点:字形美观是字符表示的主要形式缺点:旋转比较困难、占用的存储空间较大矢量式字符DEF:将字符看作是一个图形,用点坐标的序列来表示一个字符,相邻两点表示一条矢量,字符的形状便由矢量序列刻划。例:“B”是由顶点序列{a,b,c,d,e,f,e,g,h,I,j,k,a,l,a}的坐标表达调用矢量式字符的过程相当于输出一个polylin如何显示矢量字符呢?P-ShiLiangText例:(50,375)(200,375)(225,350)(225,225)(200,200)(50,200)(225,125)(225,50)(200,25)(50,25)(25,25)(25,375)inttext[]={50,375,200,375,225,350,225,225,200,200,50,200,200,200,225,175,225,50,200,25,25,25,50,25,50,375,25,375,50,375};voiddisplayText(intx,inty,int*text,intlen){inti;int*newText=malloc(sizeof(int)*len);for(i=0;ilen/2;i++){}}drawpoly(len/2,newText);newText[2*i]=x+text[2*i];newText[2*i+1]=y+text[2*i+1];除了使用drawpoly函数显示矢量字符可以采用别的方法吗?voiddisplayText2(intx,inty,int*text,intlen){inti;moveto(x+text[0],y+text[1]);for(i=1;ilen/2;i++)}lineto(x+text[2*i],y+text[2*i+1]);矢量式字符的优点:矢量式字符具有和图形相一致的数据结构,因而可以接受任何对于图形的操作,如放大、旋转,平移等5037512003751225350122522512002001502001200200122517512255012002512525150251503751253751503751abpcdqLms*=x’y’1abcdefeghIjkala字符B的旋转、平移、缩放,和斜体(x方向错切15)如何显示粗体矢量字符呢?voiddisplayText2(intx,inty,int*text,intlen){inti;setlinestyle(SOLID_LINE,0,3);moveto(x+text[0],y+text[1]);for(i=1;ilen/2;i++)lineto(x+text[2*i],y+text[2*i+1]);}方向编码DEF:方向编码式字符用有限的若干种方向编码来表达一个字符.8个方向的编码为0~7一个字符就可以表示为一连串方向码其中编码为偶数方向的增量为固定长度1,奇数方向的增量为固定长度2方向编码是:{0001122223344455666677}0001122223344455666677“B”就表示为8方向编码:{00001234440001234444066666640}000012344400012344440666664程序如何实现方向码字符输出?P-DirectText.c•Model[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},•{-1,0},{-1,1},{0,1},{1,1}};xyintdirect[27]={0,0,0,0,1,2,3,4,4,4,0,0,0,1,2,3,4,4,4,4,0,6,6,6,6,6,4};voiddisplayText(intx0,inty0,intdirect[],intlen,intsize){inti;floatModel[8][2]={{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};moveto(x0,y0);for(i=1;ilen;i++){}}linerel(Model[direct[i]][0]*size,Model[direct[i]][1]*size);如何显示粗体方向字符呢?如何显示斜体方向字符呢?voiddisplayText(intx0,inty0,intText[],intlen,intsize){inti;floatdirect[8][2]={{1,0},{sqrt2*cos30,-sqrt2*sin30},{+sin15,-cos15},{-sqrt2*sin30,-sqrt2*cos30},{-1,0},{-sqrt2*cos30,sqrt2*sin30},{-sin15,cos15},{-sqrt2*sin30,sqrt2*cos30}};moveto(x0,y0);for(i=1;ilen;i++)linerel(direct[Text[i]][0]*size,direct[Text[i]][1]*size);}0001122223344455666677voiddisplayText(intx0,inty0,intdirect[],intlen,intsize,intalfa){inti;floatModel[8][2]={{1,0},{sqrt2*cos(45-alfa),-sin(45-alfa)},{+sin(alfa),-cos(alfa)},{-sin(45-alfa),-cos(45-alfa)},{-1,0},{-cos(45-alfa),sin(45-lfa)},{sin(alfa),cos(alfa)},{sin(45-alfa),cos(45-alfa)}};moveto(x0,y0);for(i=1;ilen;i++){}}linerel(Model[direct[i]][0]*size,Model[direct[i]][1]*size);程序设计题(任选一)(1)建立一个十个字以上的字库,并能够显示该字库中的字符(选用任何字符输出方法)(2)实现DDA直线算法和DDA角度画圆算法(3)voiddraw_DDA_line(intx0,inty0,intx1,inty1){floatk;floatx,y;inttemp;floatdeltax,deltay;k=abs(y1-y0)*1.0/abs(x1-x0);my_putpixel(x0,y0,1);程序:#includestdio.h#includegraphics.h#includemath.hif(k=1){if(x0x1){temp=x0;x0=x1;x1=temp;temp=y0;y0=y1;y1=temp;}for(x=x0;xx1;x++){x=x+1;y=y+k;my_putpixel((int)x,(int)y,1);}}if(k1){if(y0y1){temp=x0;x0=x1;x1=temp;temp=y0;y0=y1;y1=temp;}for(y=y0;yy1;y++){y=y+1;x=x+1/k;my_putpixel((int)x,(int)y,1);}}}

1 / 38
下载文档,编辑使用

©2015-2020 m.111doc.com 三一刀客.

备案号:赣ICP备18015867号-1 客服联系 QQ:2149211541

×
保存成功