TurboC程序中點(diǎn)陣漢字庫(kù)和曲線漢字庫(kù)的顯示-湖南省寧鄉(xiāng)師范學(xué)校_第1頁(yè)
TurboC程序中點(diǎn)陣漢字庫(kù)和曲線漢字庫(kù)的顯示-湖南省寧鄉(xiāng)師范學(xué)校_第2頁(yè)
TurboC程序中點(diǎn)陣漢字庫(kù)和曲線漢字庫(kù)的顯示-湖南省寧鄉(xiāng)師范學(xué)校_第3頁(yè)
TurboC程序中點(diǎn)陣漢字庫(kù)和曲線漢字庫(kù)的顯示-湖南省寧鄉(xiāng)師范學(xué)校_第4頁(yè)
TurboC程序中點(diǎn)陣漢字庫(kù)和曲線漢字庫(kù)的顯示-湖南省寧鄉(xiāng)師范學(xué)校_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、turbo c 程序中點(diǎn)陣漢字庫(kù)和曲線漢字庫(kù)的顯示主題:tc程序中漢字顯示關(guān)鍵詞:ucdo軟陣字庫(kù),曲線字庫(kù)長(zhǎng)沙市信息技術(shù)學(xué)校 李水生 2011 年中秋在 turbo c 語(yǔ)言教學(xué)和程序開(kāi)發(fā)中,經(jīng)常遇到要在屏幕顯示漢字問(wèn)題。早期windows95、windows 98時(shí)期可借助ucdos字平臺(tái),在tc程序中顯示漢字,而 今,在windows xp、 windows 2000 中,由于兼容性問(wèn)題,無(wú)法安裝和運(yùn)行ucdo,s因而tc程序中不能直接顯示漢字了。本文介紹tc程序中,進(jìn)入圖形模式,無(wú)需任何漢字平臺(tái)支持,直接讀取漢字庫(kù)字模信息,用tc畫(huà)點(diǎn)函數(shù)putpixel(考慮到 通用性, 沒(méi)有使用顯卡

2、特性和顯示寄存器加速輸出 ) 顯示多種字庫(kù)漢字。 本文仍用 ucdo1s6 點(diǎn)陣、 24 點(diǎn)陣、 48 點(diǎn)陣、曲線輪廓( postscript )漢字庫(kù)和西文16 點(diǎn)陣、西文曲線輪廓字庫(kù)(字庫(kù)文件名依次為 hzk16 、 hzk24k、 hzk48s、 hzkpsxk、asc16、 ascps) 為例, 編程實(shí)現(xiàn)西文狀態(tài)下的漢字顯示。 為此, 我們必須首先了解 ucdos庫(kù)文件結(jié)構(gòu)和讀取步驟。其次是編程算法和思路以及必要條件。一、點(diǎn)陣字庫(kù)結(jié)構(gòu)和讀步驟1 先根據(jù)一個(gè)漢字高字節(jié)機(jī)內(nèi)碼計(jì)算出區(qū)碼( qm) , 再根據(jù)低字節(jié)計(jì)算出位碼( wm) ;(設(shè)漢字串指針為 hzstr 已指向一個(gè)漢字首字節(jié))2

3、 由區(qū)碼和位碼計(jì)算漢字字模信息在字庫(kù)文件中的索引位置( record ) ;3 由索引值計(jì)算字模信息在字庫(kù)文件中的起始偏移量(point) ;4 定位文件位置指針到起始偏移量處, 連續(xù)讀取單字點(diǎn)陣字節(jié)數(shù)到緩沖區(qū) ( buf ) 。 計(jì)算公式分別是:1) qm=(*hzstr-0xa0)&0x7f,wm=(*(hzstr+1)-0xa0)&0x7f2) record=(qm-16)*94+(wm-1) 注意: 16點(diǎn)陣時(shí) record=(qm-1)*94+(wm-1) 3) point=record*size其中: size 為不同點(diǎn)陣漢字字節(jié)數(shù), 16 點(diǎn)陣 size=32,24 點(diǎn)陣 siz

4、e=72,48 點(diǎn)陣 size=288西文字庫(kù)偏移量比較簡(jiǎn)單,公式為 point=asc*16其中 asc 為要顯示的單個(gè)西文字符,因?yàn)槲魑淖址菃巫止?jié),故size=16二 postscript 曲線輪廓字庫(kù)結(jié)構(gòu)和讀取步驟首先,此種字庫(kù)結(jié)構(gòu)比點(diǎn)陣字庫(kù)復(fù)雜許多,它存儲(chǔ)的是一些控制如何畫(huà)線及其坐標(biāo)信息。每個(gè)曲線輪廓字庫(kù)都兩部分組成 : 漢字索引區(qū)、字型數(shù)據(jù)區(qū)。漢字索引區(qū)由許多索引項(xiàng)組成。每個(gè)索引項(xiàng)由六個(gè)字節(jié)組成 , 其中字型數(shù)據(jù)的偏移地址4個(gè)字節(jié) , 字型數(shù)據(jù)的長(zhǎng)度占 2 個(gè)字節(jié)。 由漢字的索引提供的字型數(shù)據(jù)偏移地址及字型數(shù)據(jù)的長(zhǎng)度即可得到該漢字的字型數(shù)據(jù)。為了確定一個(gè)漢字在字庫(kù)漢字索引區(qū)的偏移量

5、, 由漢字機(jī)內(nèi)碼或區(qū)位碼即可求得漢字在曲線輪廊字庫(kù)索引區(qū)中的偏移量 , 計(jì)算方法如下 :1)區(qū)碼qmff口位碼wmz及索引值的計(jì)算與點(diǎn)陣字庫(kù)相同2 ) 偏移量 offset=record*6而英文字體(字庫(kù)名為ascps)w偏移量比較特殊,它共有10種字體,每種字體有100個(gè)英文字符,可以這樣確定偏移量( 設(shè)字體號(hào)為 n ,英文字符的 ascii 碼為cc):offset=(n*100-(cc-32)*6在 ucd0s5.0 中從此偏移量連續(xù)讀取4 個(gè)字節(jié)轉(zhuǎn)換成長(zhǎng)整型數(shù), 即為字型數(shù)據(jù)地址 (address ) ,緊接著3 個(gè)字節(jié)轉(zhuǎn)換成整型數(shù)便為字型數(shù)據(jù)的長(zhǎng)度(length ) 。在 ucd0

6、s6.0 中從此偏移量地址連續(xù)讀取4 個(gè)字節(jié)轉(zhuǎn)換成長(zhǎng)整型數(shù)后, 還需將此長(zhǎng)整型數(shù)減去十六進(jìn)制0x10000000 后才為字型數(shù)據(jù)地址, 緊接著 2 個(gè)字節(jié)轉(zhuǎn)換成整型數(shù)便為字型數(shù)據(jù)的長(zhǎng)度 (length ) ,包括符號(hào)庫(kù)。但英文字符不需要調(diào)整。4、字型數(shù)據(jù)的格式三次曲線字庫(kù)的字形數(shù)據(jù)需要解釋和重組。讀取三次曲線字庫(kù)的字形數(shù)據(jù)時(shí)每次只能讀取四位,方法是當(dāng)某一字節(jié)第一次被讀取時(shí) , 讀取低四位,當(dāng)該字節(jié)再次被讀取時(shí) , 讀取高四位。當(dāng)讀取的數(shù)據(jù)不需要被當(dāng)做坐標(biāo)量時(shí), 讀取的四位數(shù)據(jù)就會(huì)被當(dāng)做命令 (控制字) , 并進(jìn)行解釋。 如果當(dāng)前命令需要坐標(biāo)量 , 坐標(biāo)量分為絕對(duì)坐標(biāo)值和坐標(biāo)增量。 絕對(duì)坐標(biāo)值為

7、一個(gè)字節(jié), 為讀取的兩個(gè)四位數(shù)據(jù)的重組 ,重組方法為先讀取的四位數(shù)據(jù)作為高四位 , 后讀取的四位數(shù)據(jù)作為低四位。坐標(biāo)增量為四位或六位的二進(jìn)制數(shù), 其中最高位為符號(hào)位。四位坐標(biāo)增量為當(dāng)前讀取的四位數(shù)據(jù)。坐標(biāo)增量為六位二進(jìn)制數(shù)時(shí)同樣是通過(guò)重組得到的 , 方法是將第一次讀取的四位數(shù)據(jù)作為六位數(shù)據(jù)的高四位, 第二次讀取的四位數(shù)據(jù)的高兩位作為六位數(shù)據(jù)的低兩位, 得到第一個(gè)坐標(biāo)增量,然后將第二次讀取的四位數(shù)據(jù)的低兩位作為六位數(shù)據(jù)的高兩位, 第三次讀取的四位數(shù)據(jù)作為六位數(shù)據(jù)的低四位, 得 到第二個(gè)坐標(biāo)增量。5、控制字的含義ucdos勺控制字為4位(半字節(jié)),共有16種不同功能的控制字,分別控制產(chǎn)生曲線輪廊字

8、型的不同曲線 段。具體含義如下 :表 1 控制字的含義及功能控制字 參數(shù)含義長(zhǎng)度 功能 當(dāng)前點(diǎn)00000 0 x1,y1 16位 筆畫(huà)起始點(diǎn) , 將當(dāng)前點(diǎn)移至此點(diǎn) x1,y1000111x1 8 位從當(dāng)前點(diǎn)畫(huà)橫線至x1 點(diǎn)x1,cy001022y1 8 位從當(dāng)前點(diǎn)畫(huà)豎線至y1 點(diǎn)cx,y1001133x1,y1 16位從當(dāng)前點(diǎn)畫(huà)線至(x1,y1) 點(diǎn) x1,y1010044x1,y1,x2,y232 位以當(dāng)前點(diǎn)、(x1,y1)和(x2,y2)為控制點(diǎn)畫(huà)二次 bezier曲線x2,y201015 5 x1,y1,x2,y2,x3,y3 48位以當(dāng)前點(diǎn)、(x1,y1),(x2,y2)和(x3,y3

9、)為控制點(diǎn)畫(huà)三次bezier曲線 x3,y3 011066x1,y1,x2,y232 位 以(x1,y1)為左上角,(x2,y2)為右下點(diǎn)畫(huà)矩形不變011177#x1,y1 12 位從當(dāng)前點(diǎn)畫(huà)線至(cx+#x1,y1)點(diǎn) cx+#x1,y1100088x1,#y1 12 位從當(dāng)前點(diǎn)畫(huà)線至(x1+cy+#y1 點(diǎn) x1+cy+#y110019 9 #x1,#y18 位 從當(dāng)前點(diǎn)畫(huà)線至(cx+#x1,cy+#y1)點(diǎn)cx+#x1,cy+#y1101010 a &x1,&y112 位 從 當(dāng)前點(diǎn) 畫(huà)線至(cx+&x1,cy+&y1)點(diǎn)cx+&x1,cy+&y1101111 b #x1,#y1,#x2

10、,#y216位從當(dāng)前點(diǎn)、(cx+#x1,cy+#y1和(cx+#x1+#x2,cy+#y1+#y2)控制點(diǎn)畫(huà)二次 bezier曲線cx+#x1+#x2,cy+#y1+#y2110012 c &x1,&y1,&x2,&y2 24位從當(dāng)前點(diǎn)、(cx+&x1,cy+&ya)mcx+&x1+&x2,cy+&y1+&y2)空制點(diǎn)畫(huà)二次 bezier曲線cx+&x1+&x2,cy+&y1+&y2110113 d #x1,#y1,#x2,#y2,#x3,#y3 24 位從 當(dāng) 前 點(diǎn) 、(cx+#x1,cy+#y1),(cx+#x1+#x2,cy+#y1+#y2) 和(cx+#x1+#x2+#x3,cy+#

11、y1+#y2+#y3)為控制點(diǎn)畫(huà)三次bezier 曲線 cx+#x1+#x2+#x3,cy+#y1+#y2+#y3111014 e &x1,&y1,&x2,&y2,&x3,&y3 36位從當(dāng)前點(diǎn)、 (cx+ &x1, cy + &y1) , (cx+ &x1+&x2, cy + &y1+ &y2) 和(cx + &x1+ &x2+&x3, cy + &y1+ &y2+ &y3) 為控制點(diǎn)畫(huà)三次bezier 曲線cx+&x1+&x2+&x3,cy+&y1+&y2+&y3111115 f x1,y1 16位 僅讀取兩個(gè)絕對(duì)坐標(biāo), 不作其它操作, 不變說(shuō)明 : 參數(shù) x1, y1, x2, y2,

12、x3, y3 均表示 8 位長(zhǎng)度的坐標(biāo)值, 且為正數(shù) , 表示范圍為 0 至 255;參數(shù) # x1,# y1,# x2,# y2,# x3,# y3 均表示長(zhǎng)度相對(duì)當(dāng)前點(diǎn)的增量 , 最高位是符號(hào)位 ,0 表示正數(shù) ,1 表示負(fù)數(shù) , 表示范圍為 -7 至+7;參數(shù) &x1, &y1, &x2, &y2, &x3, &y3 均表示 6 位長(zhǎng)度相對(duì)當(dāng)前點(diǎn)的增量, 最高位是符號(hào)位,0 表示正數(shù) ,1 表示負(fù)數(shù) , 表示范圍為 -31 至+31; cx, cy 均表示當(dāng)前點(diǎn)的坐標(biāo)值。三 編程思路1 對(duì)于點(diǎn)陣字庫(kù):打開(kāi)相應(yīng)字庫(kù)文件,根據(jù)漢字機(jī)內(nèi)碼計(jì)算其區(qū)位碼,由區(qū)位碼計(jì)算漢字索引號(hào),由索引號(hào)乘字模字節(jié)

13、數(shù)計(jì)算漢字在字庫(kù)文件中的偏移量,從此偏移處讀取相應(yīng)字節(jié)數(shù)到內(nèi)存緩沖, 依行、 列、 位三重循環(huán)用 putpixei 函數(shù)畫(huà)點(diǎn)顯示之。2 對(duì)于曲線字庫(kù):打開(kāi)相應(yīng)字庫(kù)文件,由區(qū)位碼計(jì)算漢字索引號(hào),從文件索引號(hào)處讀取4 字節(jié)偏移量和2 字節(jié)字模長(zhǎng)度數(shù)據(jù),再?gòu)奈募铺幾x取長(zhǎng)度字模數(shù)據(jù)到內(nèi)存緩沖,將緩存中每字節(jié)高低四位易位,從中獲取4 位控制字( 0 到 15共 16 種狀態(tài)) ,根據(jù)其不同值確定是畫(huà)線段或畫(huà)矩形框,或擬合成貝塞爾曲線下的若干線段,計(jì)算端點(diǎn)或頂點(diǎn)坐標(biāo)后畫(huà)之。四 說(shuō)明1 本程序在 windows xp 平臺(tái)下 tc2.0 ide 環(huán)境中編譯運(yùn)行通過(guò)。2需準(zhǔn)備的ucdos庫(kù)文件有:hzk1

14、6,asc16,ascps,hzk24k,hzk48s,hzkpsxk,egavga.bgi 且保存到程序文件同一目錄下。 3 本程序使用的 hzk24k,hzk48s 均為顯示字庫(kù)文件,同名的打印字庫(kù)字模須作旋轉(zhuǎn)90 度處理方可正確顯示。 4 要顯示的字串可以中西文混雜, 均能正確顯示。5之所用ucdos!文字庫(kù),是因?yàn)槠滹@示西文時(shí)更圓滑,更美觀,少鋸齒。#include#include#include#include#includetypedef unsigned char uc;typedef unsigned int ui;void graph_mode();/* 進(jìn)入 tc圖形模式(

15、 640x480x16)函數(shù)*/void posthz(uc *hzstr); /*postscrip 曲線漢字庫(kù)顯示預(yù)備函數(shù)*/void hz16(uc *hzstr,int x,int y,int color); /*16 點(diǎn)陣漢字庫(kù)顯示函數(shù)*/void asc16(uc *asc,int x,int y,int color); /*16 點(diǎn)陣西文字庫(kù)顯示函數(shù)*/void hz24k(uc *hzstr,int x,int y,int color);/*24點(diǎn)陣漢字庫(kù)顯示函數(shù)*/void hz48s(uc *hzstr,int x,int y,int color);/*48點(diǎn)陣漢字庫(kù)顯示函

16、數(shù)*/void showhz( uc *hzstr,file *hz,char *fname,file *ascp);/* 曲線字庫(kù)顯示 函數(shù) */int topdot40962=0;/* 多邊形頂點(diǎn)數(shù)組*/ui fill=0; /* 封閉圖形填充標(biāo)志,為 0 只顯示字符輪廓,為 1 字符內(nèi)部填充 */ui top; /* 多邊形頂點(diǎn)計(jì)數(shù)*/main()uc *text=寧鄉(xiāng)師范學(xué)校對(duì)口升學(xué) c語(yǔ)言;uc *asc=college entrance examination for vocational school students;graph_mode();hz16(16點(diǎn)陣宋體顯示字庫(kù)演示

17、:,10,80,14);hz16(text,10,100,12);hz16(16點(diǎn)陣西文顯示字庫(kù)演示:,10,150,14);asc16(asc,10,170,15);hz16(24點(diǎn)陣楷體顯示字庫(kù)演示:,10,210,14);hz24k(text,10,230,10);hz16(48點(diǎn)陣宋體顯示字庫(kù)演示:,10,300,14);hz48s(text,10,320,13);hz16( 按任意鍵開(kāi)始曲線輪廓大字顯示.,10,390,14);getch();cleardevice();posthz(text);closegraph();textattr(0x07);clrscr();/*/ voi

18、d graph_mode() /*tc 圖形模式初始化 */ int gdrive=detect,gmode,ecode;initgraph(&gdrive,&gmode,);ecode=graphresult();if(ecode!=grok) printf(graphics error: %sn,grapherrormsg(ecode);getch();exit(0);setcolor(15);setbkcolor(0);cleardevice();directvideo=1;/*/void posthz(uc *hzstr)file *hz,*ascp;char *fname1=hzkp

19、sxkj;/* 曲線漢字庫(kù)文件名(行楷簡(jiǎn)) */char *fname2=ascps; /* 曲線西文字庫(kù)文件名 */if(hz=fopen(fname1,rb)=null) /* 打開(kāi)曲線漢字庫(kù)文件*/ printf(ucdos postscrtpt file %s open fail!n,fname1);getch();return;if(ascp=fopen(fname2,rb)=null) /* 打開(kāi)曲線西文字庫(kù)文件*/ printf(ucdos postscrtpt file %s open fail!n,fname2);getch();return;rewind(hz);rewin

20、d(ascp);showhz(hzstr,hz,fname1,ascp);/* 顯示曲線字串 */fclose(hz);fclose(ascp);/*/void showhz(uc *hzstr,file *hz,char *fname,file *ascp)# define bit8 8 /* 二進(jìn)制位宏*/# define bit6 6# define bit4 4void bezier_3(int *x,int *y);/*void bezier_4(int *x,int *y); /*uc getbit(ui *n,ui b,uc *bitbuf);/*ui getint( int n

21、um,double scl);/*二次貝塞爾( bezier )曲線函數(shù)*/三次貝塞爾( bezier )曲線函數(shù)*/取二進(jìn)制位函數(shù)*/四舍五入取整函數(shù)*/uc *bitbuf,*dotbuf; /* 位緩沖區(qū)和點(diǎn)緩沖區(qū)指針*/double scalex=3.4,scaley=3;/* 漢字水平和垂直放大因子*/typedef struct /* 曲線字庫(kù)中漢字信息索引結(jié)構(gòu)體 */ long fontoffset; /* 字模偏移量*/int fontlength; /*字模信息長(zhǎng)度*/index;index fontdata=0l,0;int qm,wm; /* 漢字區(qū)碼和位碼*/long

22、offset;int z1,i,j;ui loop;int xx4,yy4,x1,y1,x2,y2,x3,y3,cx=0,cy=0;/*cx,cy為畫(huà)筆當(dāng)前點(diǎn)坐標(biāo)(即起點(diǎn)) xx,yy 為頂點(diǎn)坐標(biāo)數(shù)組*/uc dx4,dy4,dx6,dy6,tmp,data,ctrl_word;/* 分別為 4 位、 6 位、坐標(biāo)增量及控制字 */file *fp;/* for(qm=16;qm88;qm+) 此注釋可顯示字庫(kù)中全部漢字*/for(wm=1;wm95;wm+)*/while(*hzstr) /* 顯示串中所有漢字 */if(*hzstr160) /* 若為西文,則用西文字庫(kù)顯示*/ fp=as

23、cp;offset=(4*100-(*hzstr-32)-17)*6;hzstr+; /* 確定西文偏移 */else /* 否則,用漢字庫(kù)顯示*/fp=hz;qm=(*hzstr-0xa0)&0x7f; /* 計(jì)算漢字區(qū)碼*/wm=(*(hzstr+1)-0xa0)&0x7f;/* 計(jì)算漢字位碼*/offset=(qm-16)*94+(wm-1)*6l;/* 計(jì)算漢字在字庫(kù)中的索引 */ hzstr+=2; fseek(fp,offset,seek_set); fread(&fontdata,sizeof(fontdata),1,fp);/*讀索引信息*/fseek(fp,fontdata.

24、fontoffset,seek_set); dotbuf=(uc *)malloc(fontdata.fontlength*sizeof(char)+10);/*分配動(dòng)態(tài)內(nèi)存 */if(!dotbuf)printf(memory notn);getch();return;z1=fontdata.fontlength;if(fread(dotbuf,1,z1,fp)!=z1) /*從字庫(kù)文件中讀字模信息 */ printf(end of %s filen,fname);getch();return;bitbuf=(uc *)malloc(8*z1*sizeof(char)+10);if(!bit

25、buf)printf(memory overflow!n);getch();return;for(i=0;iz1;i+) /* 字模各字節(jié)高低四位易位*/dotbufi=(dotbufi4);loop=0;for(i=0;iz1;i+)for(j=0;j(7-j)&1; /*存數(shù)組 */loop=top=0;while(loop5)&fill&(ctrl_word=0)/* setcolor(15);if(getpixel(topdot00,topdot01)=12)/*/setfillstyle(1,0);/* 已填紅色漢字內(nèi)多邊形孤島用黑色填充 */elsesetfillstyle(1,1

26、2);/*若多邊形內(nèi)無(wú)孤島則用紅色填充 */fillpoly(top-1,(int far *)topdot); /* 畫(huà)多邊形并填充 */top=0;/* 畫(huà)完一個(gè)多邊形后頂點(diǎn)數(shù)重回 0*/if(ctrl_word)setcolor(ctrl_word); /*設(shè)置畫(huà)線顏色*/switch(ctrl_word) /* 根據(jù)控制字(4 位二進(jìn)制表示0 到 15) 確定連線點(diǎn)坐標(biāo)及如何畫(huà)線*/case 0:x1=getbit(&loop,bit8,bitbuf);/*y1=getbit(&loop,bit8,bitbuf);/*x1=getint(x1,scalex); /*x*/y1=geti

27、nt(y1,scaley);/*yif(fill)topdottop0=x1;topdottop+1=y1;/*從位緩沖取8 位絕對(duì) x 坐標(biāo) */取 8 位絕對(duì) y 坐標(biāo) */坐標(biāo)放大 scalex 倍后四舍五入取整坐標(biāo)放大 scaley 倍 */若填充時(shí)將 x1,y1 存入多邊形頂點(diǎn)數(shù)組 */else moveto(x1,y1);/* 只移動(dòng)畫(huà)筆*/cx=x1;cy=y1;/* 確定畫(huà)筆當(dāng)前點(diǎn)坐標(biāo)*/break;case 1:x1=getbit(&loop,bit8,bitbuf);x1=getint(x1,scalex);if(fill)topdottop0=x1;topdottop+1

28、=cy;else line(cx,cy,x1,cy);/*二點(diǎn)畫(huà)水平直線段*/cx=x1;break;case 2:y1=getbit(&loop,bit8,bitbuf);y1=getint(y1,scaley);if(fill)topdottop0=cx;topdottop+1=y1; /*若要填充,線段末端坐標(biāo)存多邊形頂點(diǎn)數(shù)組*/else line(cx,cy,cx,y1);/* 畫(huà)垂直直線段*/ cy=y1;break;case 3:x1=getbit(&loop,bit8,bitbuf);y1=getbit(&loop,bit8,bitbuf);x1=getint(x1,scalex

29、);y1=getint(y1,scaley);if(fill)topdottop0=x1;topdottop+1=y1;else line(cx,cy,x1,y1);/* 畫(huà)斜線段 */cx=x1;cy=y1;break;case 4:x1=getbit(&loop,bit8,bitbuf);y1=getbit(&loop,bit8,bitbuf);x2=getbit(&loop,bit8,bitbuf);y2=getbit(&loop,bit8,bitbuf);x1=getint(x1,scalex);y1=getint(y1,scaley);x2=getint(x2,scalex);y2=

30、getint(y2,scaley);xx0=cx;yy0=cy;xx1=x1;yy1=y1;xx2=x2;yy2=y2;cx=xx2;cy=yy2;bezier_3(xx,yy); /* 三個(gè)頂點(diǎn)畫(huà)二次貝塞爾曲線*/break;case 5:x1=getbit(&loop,bit8,bitbuf);y1=getbit(&loop,bit8,bitbuf);x2=getbit(&loop,bit8,bitbuf);y2=getbit(&loop,bit8,bitbuf);x3=getbit(&loop,bit8,bitbuf);y3=getbit(&loop,bit8,bitbuf);x1=ge

31、tint(x1,scalex);y1=getint(y1,scaley);x2=getint(x2,scalex);y2=getint(y2,scaley);x3=getint(x3,scalex);y3=getint(y3,scaley);xx0=cx;yy0=cy;xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;cx=xx3;cy=yy3;bezier_4(xx,yy);/* 四個(gè)頂點(diǎn)畫(huà)三次貝塞爾曲線*/break;case 6:x1=getbit(&loop,bit8,bitbuf);y1=getbit(&loop,bit8,bitbuf);x2=ge

32、tbit(&loop,bit8,bitbuf);y2=getbit(&loop,bit8,bitbuf);x1=getint(x1,scalex);y1=getint(y1,scaley);x2=getint(x2,scalex);y2=getint(y2,scaley);rectangle(x1,y1,x2,y2);/*畫(huà)矩形框 */break;case 7:dx4=getbit(&loop,bit4,bitbuf); /*從緩沖取 4 位坐標(biāo)改變量*/y1=getbit(&loop,bit8,bitbuf);y1=getint(y1,scaley);dx4&=0x0f; /* 取低 4 位

33、改變量 */tmp=dx4&0x07;/* 取低 3 改變量絕對(duì)值*/tmp=getint(tmp,scalex);if(dx4&8)x1=cx-tmp;/* 取 4 位中最高位若為 1,則改變量為負(fù) */else x1=cx+tmp; /* 否則改變量為正 */若要填if(fill)topdottop0=x1;topdottop+1=y1;/*充,線段末端點(diǎn)存多邊形頂點(diǎn)數(shù)組*/else line(cx,cy,x1,y1);/*從畫(huà)筆當(dāng)前點(diǎn)( cx,cy )至( x1,y1 )畫(huà)直線段 */cx=x1;cy=y1;break;case 8:x1=getbit(&loop,bit8,bitbuf

34、);x1=getint(x1,scalex);dy4=getbit(&loop,bit4,bitbuf);dy4&=0x0f;tmp=dy4&0x07;tmp=getint(tmp,scaley);if(dy4&8)y1=cy-tmp;else y1=cy+tmp;if(fill)topdottop0=x1;topdottop+1=y1;else line (cx,cy,x1,y1);/* 畫(huà)直線段 */cx=x1;cy=y1;break;case 9:dx4=getbit(&loop,bit4,bitbuf)&0x0f;dy4=getbit(&loop,bit4,bitbuf)&0x0f;t

35、mp=dx4&0x07;tmp=getint(tmp,scalex);if(dx4&8)x1=cx-tmp;else x1=cx+tmp;tmp=dy4&0x07;tmp=getint(tmp,scaley);if(dy4&8)y1=cy-tmp;else y1=cy+tmp;if(fill)topdottop0=x1;topdottop+1=y1;else line(cx,cy,x1,y1);/* 畫(huà)直線段 */cx=x1;cy=y1;break;case 10:dx6=getbit(&loop,bit6,bitbuf)&0x3f;/*從緩沖區(qū)取6 位坐標(biāo) x改變量最高位是符號(hào)位*/dy6=

36、getbit(&loop,bit6,bitbuf)&0x3f;/*從緩沖區(qū)取6位坐標(biāo) y改變量最高位是符號(hào)位*/tmp=dx6&0x1f; /* 取 6 位中低 5 位為 x 坐標(biāo)改變量絕對(duì)值*/tmp=getint(tmp,scalex);if(dx6&0x20)x1=cx-tmp;/* 取 6 位中最高位若為 1, 則改變量為負(fù)*/else x1=cx+tmp; /* 否則為正 */tmp=dy6&0x1f;tmp=getint(tmp,scaley);if(dy6&0x20)y1=cy-tmp;else y1=cy+tmp;if(fill)topdottop0=x1;topdottop+

37、1=y1; /*若填充存頂點(diǎn)數(shù)組*/else line(cx,cy,x1,y1);/* 畫(huà)直線段 */cx=x1;cy=y1;break;- 15 -y1=getbit(&loop,bit6,bitbuf)&0x3f;y1=getbit(&loop,bit4,bitbuf)&0x0f;x2=getbit(&loop,bit4,bitbuf)&0x0f;y2=getbit(&loop,bit4,bitbuf)&0x0f;tmp=x1&0x07;tmp=getint(tmp,scalex);if(x1&8)x1=cx-tmp;else x1=cx+tmp;tmp=y1&0x07;tmp=getin

38、t(tmp,scaley);if(y1&8)y1=cy-tmp;else y1=cy+tmp;tmp=x2&0x07;tmp=getint(tmp,scalex);if(x2&8)x2=x1-tmp;else x2=x1+tmp;tmp=y2&0x07;tmp=getint(tmp,scaley);if(y2&8)y2=y1-tmp;else y2=y1+tmp;xx0=cx;yy0=cy;xx1=x1;yy1=y1;xx2=x2;yy2=y2;bezier_3(xx,yy);/* 三點(diǎn)畫(huà)二次貝塞爾曲線*/cx=x2;cy=y2;break;case 11:x1=getbit(&loop,bi

39、t6,bitbuf)&0x3f;x2=getbit(&loop,bit6,bitbuf)&0x3f;y2=getbit(&loop,bit6,bitbuf)&0x3f;tmp=x1&0x1f; tmp=getint(tmp,scalex);if(x1&0x20)x1=cx-tmp;else x1=cx+tmp;tmp=y1&0x1f; tmp=getint(tmp,scaley);if(y1&0x20)y1=cy-tmp;else y1=cy+tmp;tmp=x2&0x1f; tmp=getint(tmp,scalex);if(x2&0x20) x2=x1-tmp;else x2=x1+tmp

40、;tmp=y2&0x1f; tmp=getint(tmp,scaley);if(y2&0x20) y2=y1-tmp;else y2=y1+tmp;xx0=cx;yy0=cy;xx1=x1;yy1=y1;xx2=x2;yy2=y2;bezier_3(xx,yy);/* 畫(huà)二次貝塞爾曲線*/cx=x2;cy=y2;break;case 12:x1=getbit(&loop,bit4,bitbuf)&0x0f;y1=getbit(&loop,bit4,bitbuf)&0x0f;x2=getbit(&loop,bit4,bitbuf)&0x0f;y2=getbit(&loop,bit4,bitbuf

41、)&0x0f;x3=getbit(&loop,bit4,bitbuf)&0x0f;y3=getbit(&loop,bit4,bitbuf)&0x0f;tmp=x1&0x07; tmp=getint(tmp,scalex);- 17 -if(x1&8)x1=cx-tmp;else x1=cx+tmp;tmp=y1&0x07; tmp=getint(tmp,scaley);if(y1&8)y1=cy-tmp;else y1=cy+tmp;tmp=x2&0x07; tmp=getint(tmp,scalex);if(x2&8) x2=x1-tmp;else x2=x1+tmp;tmp=y2&0x07

42、; tmp=getint(tmp,scaley);if(y2&8)y2=y1-tmp;else y2=y1+tmp;tmp=x3&0x07; tmp=getint(tmp,scalex);if(x3&8)x3=x2-tmp;else x3=x2+tmp;tmp=y3&0x07; tmp=getint(tmp,scaley);if(y3&8)y3=y2-tmp;else y3=y2+tmp;xx0=cx;yy0=cy;xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;bezier_4(xx,yy);/* 四個(gè)頂點(diǎn)畫(huà)三次貝塞爾曲線*/cx=x3;cy=y3;bre

43、ak;case 13:x1=getbit(&loop,bit6,bitbuf)&0x3f;y1=getbit(&loop,bit6,bitbuf)&0x3f;x2=getbit(&loop,bit6,bitbuf)&0x3f;y2=getbit(&loop,bit6,bitbuf)&0x3f;- 18 -x3=getbit(&loop,bit6,bitbuf)&0x3f;y3=getbit(&loop,bit6,bitbuf)&0x3f;tmp=x1&0x1f; tmp=getint(tmp,scalex);if(x1&0x20)x1=cx-tmp;else x1=cx+tmp;tmp=y1&

44、0x1f; tmp=getint(tmp,scaley);if(y1&0x20)y1=cy-tmp;else y1=cy+tmp;tmp=x2&0x1f; tmp=getint(tmp,scalex);if(x2&0x20) x2=x1-tmp;else x2=x1+tmp;tmp=y2&0x1f; tmp=getint(tmp,scaley);if(y2&0x20)y2=y1-tmp;else y2=y1+tmp;tmp=x3&0x1f; tmp=getint(tmp,scalex);if(x3&0x20)x3=x2-tmp;else x3=x2+tmp;tmp=y3&0x1f; tmp=g

45、etint(tmp,scaley);if(y3&0x20)y3=y2-tmp;else y3=y2+tmp;xx0=cx;yy0=cy;xx1=x1;yy1=y1;xx2=x2;yy2=y2;xx3=x3;yy3=y3;bezier_4(xx,yy);/* 四點(diǎn)畫(huà)三次貝塞爾曲線*/cx=x3;cy=y3;break;case 14:x1=getbit(&loop,bit8,bitbuf);/*從緩沖取 8 位 x 坐標(biāo) */- 19 - 21 -從緩沖取 8 位 y 坐標(biāo) */y1=getbit(&loop,bit8,bitbuf);/*/* 控制字為 15 不做任何操作 */break; /

46、* end while(loop=8*z1)setcolor(15);if(getpixel(topdot00,topdot01)=12)setfillstyle(1,0);/* 多邊形內(nèi)孤島實(shí)填充黑色*/elsesetfillstyle(1,12);/* 多邊形內(nèi)實(shí)填充紅色*/fillpoly(top-1,(int far*)topdot);/* 當(dāng)填充為真,畫(huà)該漢字最后一個(gè)封閉多邊形并填充*/top=0;/* 多邊形頂點(diǎn)數(shù)重歸 0*/free(dotbuf);free(bitbuf);getch();cleardevice();/*end while(*hzstr)*/*/void bez

47、ier_3(int *x,int *y)int *bx,*by;int i,n=20; /* 用 20條直線段擬合曲線*/double a0,a1,a2,dt,xx,t1,t2;bx=(int *)malloc(n*sizeof(int);by=(int *)malloc(n*sizeof(int);if(!bx|!by) printf(memory error!n);exit(0);dt=(double)1/(double)n;a2=x0-2*x1+x2;a1=-2*x0+2*x1;a0=x0;bx0=x0;for(i=1;in;i+)t1=i*dt;t2=t1*t1;bxi=a0+a1*t

48、1+a2*t2;a2=y0-2*y1+y2;a1=-2*y0+2*y1;a0=y0;by0=y0;for(i=1;i!: h!)oj :(0aq,0xq)oaoiu esp :后從=u+doiiopdoi : x=doihopdoj :!mq=u+d3lopd3!ixq=odoiiopdoi (k!aq=i!aq)|(|.-!xq=j!xq)j!(+!: h!)。getch();exit(0);dt=(double)1/(double)n;a3=-x0+3*x1-3*x2+x3;a2=3*(x0-2*x1+x2);a1=3*(x1-x0);a0=x0;bx0=x0;for(i=1;in;i+)

49、 t1=i*dt;t2=t1*t1;t3=t1*t2;bxi=a0+a1*t1+a2*t2+a3*t3;a3=-y0+3*y1-3*y2+y3;a2=3*(y0-2*y1+y2);a1=3*(y1-y0);a0=y0;by0=y0;for(i=1;in;i+)t1=i*dt;t2=t1*t1;t3=t1*t2;byi=a0+a1*t1+a2*t2+a3*t3;if(fill) /* 諸線段末端坐標(biāo)存多邊形頂點(diǎn)數(shù)組,以便填充 */topdottop0=bx0;topdottop+1=by0;for(i=1;in;i+)if(bxi!=bxi-1)|(byi!=byi-1) topdottop0=bxi;topdottop+1=byi;topdottop0=x3;topdottop+1=y3;elsemoveto(bx0,by0);/* 移動(dòng)畫(huà)筆 */for(i=1;in;i+)if(bxi!=bxi-1)|(byi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論