計(jì)算機(jī)圖形學(xué)綜合實(shí)驗(yàn)設(shè)計(jì)——用C語(yǔ)言實(shí)現(xiàn)畫圖板的功能

計(jì)算機(jī)圖形學(xué)綜合實(shí)驗(yàn)設(shè)計(jì) ——用C語(yǔ)言實(shí)現(xiàn)畫圖板的功能學(xué) 院:信息管理學(xué)院 專 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)姓 名:趙 某某 學(xué)號(hào):****08030132計(jì)算機(jī)圖形學(xué)綜合實(shí)驗(yàn)設(shè)計(jì) ————畫圖板Windows系統(tǒng)自帶的畫圖板簡(jiǎn)單靈巧,為用戶的小型圖形開(kāi)發(fā)工作帶來(lái)了很多便利本實(shí)驗(yàn)完全利用C語(yǔ)言開(kāi)發(fā)了一個(gè)畫圖板,該畫圖板具有畫圖、調(diào)整圖形大小與方位、保存與打開(kāi)文件等基本圖能一.設(shè)計(jì)目的利用C語(yǔ)言完成了一個(gè)Windows應(yīng)用程序的開(kāi)發(fā)——畫圖板,該畫圖板能實(shí)現(xiàn)基本的圖形操作功能通過(guò)本次實(shí)驗(yàn),應(yīng)該了解怎么將像素寫入文件、怎么從文件中讀取像素;了解直線、矩形、圓和Bezier曲線等圖形的繪制原理、旋轉(zhuǎn)原理、移動(dòng)院里和縮放原理等二.功能描述本實(shí)驗(yàn)利用C語(yǔ)言編程實(shí)現(xiàn)的畫圖板,具有基本的畫圖功能、圖形操作功能和文件保存打開(kāi)功能等1)圖形繪制功能(1)繪制直線:能繪制任意角度的直線,能實(shí)現(xiàn)直線的旋轉(zhuǎn)、伸長(zhǎng)、縮短和上下左右移動(dòng)。
2)繪制矩形:能繪制任意大?。ó嫴挤秶鷥?nèi))的矩形,能實(shí)現(xiàn)矩形的放大、縮小和上下左右移動(dòng)3)繪制圓形:能繪制任意半徑大?。ó嫴挤秶鷥?nèi))的圓形,能實(shí)現(xiàn)圓形的放大和縮小4)繪制Bezier曲線:能根據(jù)屏幕上的點(diǎn)(單擊鼠標(biāo)后產(chǎn)生的點(diǎn))繪制出Bezier曲線2)文件處理功能(1)保存:能保存畫布中的所有圖形到指定的文件2)加載:能打開(kāi)指定的文件,將其內(nèi)容加載到畫布中3)用戶幫助功能顯示用戶使用指南,包括各種圖形的繪制方法和操作方法等三. 總體設(shè)計(jì)1. 系統(tǒng)模塊圖本系統(tǒng)包括4個(gè)模塊,分別是圖形繪制模塊、鼠標(biāo)控制模塊、功能控制模塊和保存加載模塊.(1)圖形繪制模塊該模塊包括圖形的繪制和操作功能,主要有繪制直線、移動(dòng)直線、縮放和旋轉(zhuǎn)直線;繪制矩形、移動(dòng)和縮放矩形;繪制和縮放圓形;繪制Bezier曲線2)鼠標(biāo)控制模塊該模塊主要實(shí)現(xiàn)鼠標(biāo)狀態(tài)的獲取、鼠標(biāo)位置的設(shè)置,以及鼠標(biāo)的繪制等3)功能控制模塊該模塊實(shí)現(xiàn)的功能包括輸出中文、填充像素和顯示用戶幫助4)保存加載模塊該模塊將像素保存到指定文件和從指定文件中讀取像素到畫布2.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計(jì)● int Rx,Ry,R:分別表示所畫圓形的圓心的橫坐標(biāo)、縱坐標(biāo),以及圓的半徑。
● int TOPx,TOPy,BOTTOMx,BOTTOMy:分別表示所畫矩形的左上角的橫坐標(biāo)、縱坐標(biāo),以及右下角的橫坐標(biāo)、縱坐標(biāo)● int Centx,Centy:表示直線或者矩形旋轉(zhuǎn)中心點(diǎn)的橫坐標(biāo)和縱坐標(biāo)● int lineStartx,lineStarty,lineEndx,lineEndy:分別表示直線的起點(diǎn)橫坐標(biāo)、縱坐標(biāo),以及終點(diǎn)的橫坐標(biāo)、縱坐標(biāo)● int linePoint_x[20],linePoint_y[20]:這兩個(gè)數(shù)組用于在畫Bezier曲線時(shí)存儲(chǔ)所選點(diǎn)的橫坐標(biāo)和縱坐標(biāo)3.函數(shù)功能描述 1) outChinese()函數(shù)原型: void outChinese(char*mat,int x,int y,int color)本程序中雖然有中文顯示,但是顯示的中文不多,所以就沒(méi)有加載中文字庫(kù),而是生成字模信息來(lái)建立一個(gè)小型字庫(kù),以此來(lái)減輕程序“負(fù)擔(dān)” outChinese()函數(shù)根據(jù)點(diǎn)陣信息顯示中文,其中mat 為字模指針,matisize 為點(diǎn)陣大小,x和y表示起始坐標(biāo),color表示顯示的顏色2) fill()函數(shù)原型: void fill(int startx,int starty,int endy, int color)Fill()函數(shù)用于以指定的顏色填充指定的區(qū)域。
其中 startx、starty 表示填充區(qū)域的左上角橫、縱坐標(biāo),endx、endy表示填充區(qū)域的右下角的橫、縱坐標(biāo),color 表示填充的顏色該函數(shù)調(diào)用系統(tǒng)畫圖函數(shù)putpixel()來(lái)實(shí)現(xiàn)3) showHelp()函數(shù)原型:void showHelp()showHelp()函數(shù)用于顯示用戶使用指南用戶使用指南包括各種圖行的繪制方法和調(diào)整方法等4) save()函數(shù)原型:void save()Save()函數(shù)用于保存畫布中的圖形用戶首先輸入保存文件的文件名,然后將畫布中的像素寫入文件,保存文件是以“.dat”結(jié)尾的保存完畢將提示用戶5)函數(shù)原型: void load()load()函數(shù)用于打開(kāi)已有的圖形用戶首先輸入打開(kāi)文件的文件名,然后將文件中的像素輸入到畫布中打開(kāi)完畢將提示用戶如果打開(kāi)過(guò)程中出現(xiàn)錯(cuò)誤,如沒(méi)有找到指定的文件等,也將顯示錯(cuò)誤信息6) mouseStatus()函數(shù)原型: int mouseStatus(int*x,int*y)mouseStatus()函數(shù)用于獲取鼠標(biāo)的狀態(tài),包括鼠標(biāo)指針?biāo)幍臋M坐標(biāo)、縱坐標(biāo),以及鼠標(biāo)的按鍵情況中斷的入口參數(shù)AH為03H,出口參數(shù)BH表示鼠標(biāo)按鍵狀態(tài),位0為1表示按下左鍵,位1為1表示按下右鍵,位2為1表示按下中鍵;CX表示水平位置,DX表示垂直位置。
函數(shù)中傳遞的指針參數(shù)x、y 分別用來(lái)接收鼠標(biāo)指針的水平位置和垂直位置 7)setMousePos()函數(shù)原型:int setMosePos(int x,int y)setMousePos()函數(shù)用來(lái)設(shè)置鼠標(biāo)的位置X、y分別表示預(yù)設(shè)置的橫坐標(biāo)和縱坐標(biāo)這里中斷的入口參數(shù)AH為1,分別把x和y賦給寄存器CX和DX8)DrawMouse()函數(shù)原型:voidDrawMouse(float x,float y)DrawMouse()函數(shù)用于繪制鼠標(biāo)X、y分別表示鼠標(biāo)指針?biāo)幍奈恢?)DrawLine()函數(shù)原型:void DrawLine()DrawLine()函數(shù)用于繪制直線單擊鼠標(biāo)左鍵,捕獲鼠標(biāo)指針位置,并以此為起點(diǎn)開(kāi)始畫直線,拖動(dòng)鼠標(biāo),松開(kāi)鼠標(biāo)結(jié)束繪制然后可以通過(guò)鍵盤來(lái)調(diào)整直線的位置、大小等10) DrawRectangle()函數(shù)原型:void DrawRectangle()DrawRectangle()函數(shù)用于繪制矩形其繪制方法與直線的繪制方法一致11)LineToCircle()函數(shù)原型:void LineToCircle(int x0,int y0,int r)LineToCircle()函數(shù)實(shí)現(xiàn)的是直線法生成圓。
x0、y0表示圓心,r表示半徑直線法生成圓的相關(guān)知識(shí)讀者可查閱圖形學(xué)資料12)DrawCircle()函數(shù)原型:void DrawCircle()DrawCircle()函數(shù)實(shí)現(xiàn)的是畫圓功能,該函數(shù)是調(diào)用LineToCircle()函數(shù)來(lái)實(shí)現(xiàn)的13)factorial()函數(shù)原型:void factorial(int n)factorial()函數(shù)用于求階乘,n表示需要求階乘的函數(shù)求階乘的方法很多,本程序中使用的是比較原始的方法,即從n依次乘到1,也可以用遞歸來(lái)實(shí)現(xiàn),讀者可以自行設(shè)計(jì)14)berFunction()函數(shù)原型:float berFunction(int I,int n,double t)berFunction()函數(shù)是伯恩斯坦基函數(shù)的計(jì)算,該函數(shù)調(diào)用了前面的階乘函數(shù)factorial().15)DrawBezier()函數(shù)原型:void DrawBezier()DrawBezier()?函數(shù)實(shí)現(xiàn)畫Bezier曲線,該函數(shù)調(diào)用了berFunction()函數(shù)Bezier曲線的繪制涉及到數(shù)學(xué)知識(shí),讀者可查閱相關(guān)資料4.程序?qū)崿F(xiàn)4.1預(yù)處理程序預(yù)處理包括頭文件的加載、常量的定義和全局變量的定義,以及點(diǎn)陣字模的定義。
include
/char zhi16K[]={/* 以下是 '直' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x01,0x00,0x01,0x00,0x01,0xF0,0x1E,0x00, 0x02,0x00,0x07,0xC0,0x08,0x40,0x0F,0x40, 0x08,0x40,0x0F,0x40,0x08,0x40,0x0F,0x40, 0x08,0x40,0x0F,0xFC,0x70,0x00,0x00,0x00,};char xian16K[]={/* 以下是 '線' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x80,0x00,0x90,0x08,0x88,0x10,0x80, 0x24,0xF0,0x45,0x80,0x78,0xB0,0x11,0xC0, 0x2C,0x88,0x70,0x50,0x04,0x60,0x18,0xA4, 0x63,0x14,0x00,0x0C,0x00,0x04,0x00,0x00,};char ju16K[]={/* 以下是 '矩' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x00,0x08,0x00,0x08,0x78,0x10,0x80, 0x1E,0x80,0x28,0xF8,0x48,0x88,0x0E,0x88, 0xF8,0xF0,0x08,0x80,0x14,0x80,0x12,0x9E, 0x20,0xE0,0x40,0x00,0x00,0x00,0x00,0x00,};char xing16K[]={/* 以下是 '形' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x00,0x07,0x88,0x3A,0x08,0x12,0x10, 0x12,0x20,0x17,0x48,0xFA,0x10,0x12,0x20, 0x12,0xC8,0x12,0x08,0x22,0x10,0x42,0x20, 0x00,0x40,0x00,0x80,0x03,0x00,0x00,0x00,};char yuan16K[]={/* 以下是 '圓' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0xF8,0x3F,0x08,0x23,0x88,0x24,0x88, 0x27,0x08,0x21,0xC8,0x2E,0x48,0x29,0x48, 0x29,0x48,0x22,0x88,0x24,0x48,0x28,0x08, 0x3F,0xE8,0x00,0x10,0x00,0x00,0x00,0x00,};char qing16K[]={/* 以下是 '清' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x80,0x00,0xE0,0x33,0x80,0x10,0xE0, 0x03,0x80,0x40,0xFC,0x2F,0x00,0x01,0xE0, 0x12,0x20,0x13,0xA0,0x22,0x20,0x63,0xA0, 0x42,0x20,0x02,0x60,0x00,0x20,0x00,0x00,};char ping16K[]={/* 以下是 '屏' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0xF0,0x0F,0x30,0x08,0x60,0x0F,0x80, 0x0A,0x20,0x09,0x40,0x08,0xF8,0x17,0x20, 0x11,0x3E,0x2F,0xE0,0x21,0x20,0x42,0x20, 0x82,0x20,0x04,0x20,0x08,0x20,0x00,0x00,};char bao16K[]={/* 以下是 '保' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x00,0x09,0xF0,0x0A,0x10,0x12,0x10, 0x13,0xE0,0x30,0x80,0x50,0xFC,0x9F,0x80, 0x11,0xC0,0x12,0xA0,0x14,0x98,0x18,0x8E, 0x10,0x80,0x10,0x80,0x00,0x00,0x00,0x00,};char cun16K[]={/* 以下是 '存' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x01,0x00,0x01,0x00,0x01,0xF0,0x1E,0x00, 0x02,0x70,0x05,0x90,0x08,0x20,0x08,0x40, 0x18,0x7E,0x2B,0xA0,0xC8,0x20,0x08,0x20, 0x08,0x20,0x08,0xA0,0x00,0x40,0x00,0x00,};char jia16K[]={/* 以下是 '加' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00, 0x0F,0x00,0x79,0x3C,0x09,0x44,0x11,0x44, 0x11,0x44,0x22,0x44,0x22,0x78,0x4A,0x00, 0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,};char zai16K[]={/* 以下是 '載' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x80,0x08,0xA0,0x08,0x90,0x0E,0x80, 0x38,0xF0,0x0F,0x80,0x78,0x50,0x0E,0x50, 0x34,0x20,0x1E,0x20,0x34,0x50,0x0E,0x92, 0x75,0x0A,0x04,0x06,0x04,0x02,0x00,0x00,};char bang16K[]={/* 以下是 '幫' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x04,0x00,0x07,0x38,0x1C,0x48,0x06,0x50, 0x1C,0x50,0x07,0x48,0x78,0x58,0x11,0x40, 0x21,0xF0,0x4F,0x10,0x09,0x10,0x09,0x50, 0x09,0x20,0x01,0x00,0x01,0x00,0x00,0x00,};char zhu16K[]={/* 以下是 '助' 的 16點(diǎn)陣楷體_GB2312 字模,32 byte */ 0x00,0x00,0x00,0x20,0x0C,0x20,0x34,0x20, 0x24,0x20,0x34,0x38,0x25,0xC8,0x34,0x48, 0x24,0x48,0x26,0x88,0x38,0x88,0xE1,0x28, 0x02,0x10,0x04,0x00,0x00,0x00,0x00,0x00,};4.2控制模塊 功能控制模塊主要實(shí)現(xiàn)根據(jù)點(diǎn)陣信息顯示中文功能、填充屏幕功能和顯示用戶指南功能,分別由函數(shù)outChinese()、fill()和showHelp()來(lái)實(shí)現(xiàn)。
1) void outChinese(char*mat,int matsize,int x,int y,int color),根據(jù)定義的點(diǎn)陣字模數(shù)組顯示中文2) void fill(int startx,int starty,int endx,int endy,int color),在指定的區(qū)域用指定的顏色來(lái)填充3) void showHelp(),顯示用戶使用指南,包括直線、矩形、圓形和Bezier曲線的繪制方法 /*根據(jù)點(diǎn)陣信息顯示中文函數(shù)* /void outChinese(char *mat,int matsize,int x,int y,int color) { int i,j,k,n; n=(matsize -1)/8+1 for(j=0;j
分別由函數(shù) save() 和 load()來(lái)實(shí)現(xiàn)1) void save(), 保存畫布中的像素到指定文件2) void load(), 將指定文件中的像素加載到畫布中 /*保存參數(shù)*/void save(){ int i,j; FILE *fp; char fileName[20]; fill(0,447,630,477,2); gotoxy(1,25); printf("\n\n\n\n Input the file name[.dat]:"); scanf("%s",fileName); fill(0,447,630,477,2); /*以讀寫的方式打開(kāi)文件*/ if((fp=fopen(fileName,"w+"))==NULL) { outtextxy(260,455,"Failed to open file!"); exit(0); } outtextxy(280,455,"saving..."); /*保存像素到文件*/ for(i=5;i<630;i++) for(j=30;j<=445;j++) fputc(getpixel(i,j),fp); fclose(fp); fill(0,447,630,477,2); outtextxy(260,455,"save over!");} /*打開(kāi)函數(shù)*/void load(){ int i,j; char fileName[20]; FILE *fp; fill(0,447,630,477,2); gotoxy(1,25); printf("\n\n\n\n Input the file name[.dat]:"); scanf("%s",fileName); /*打開(kāi)指定的文件*/ if((fp=fopen(fileName,"r+"))!=NULL) { fill(0,447,630,477,2); outtextxy(280,455,"loading..."); /*從文件中讀出像素*/ for(i=5;i<630;i++) for(j=30;j<=445;j++) putpixel(i,j,fgetc(fp)); fill(0,447,630,477,2); outtextxy(280,455,"loading over !"); } /*打開(kāi)失敗*/ else { fill(0,447,630,477,2); outtextxy(260,455,"Failed to open file!"); } fclose(fp);}4.4鼠標(biāo)控制模塊鼠標(biāo)控制模塊實(shí)現(xiàn)的是對(duì)鼠標(biāo)的操作,包括鼠標(biāo)狀態(tài)的獲取、鼠標(biāo)位置的設(shè)置和繪制鼠標(biāo),著幾個(gè)功能分別由函數(shù) mouseStatus()、setMousePos()和 drawMouse()來(lái)實(shí)現(xiàn)。
1) int mouseStatus(int* x, int* y), 獲取鼠標(biāo)的位置,包括水平位置和垂直位置,以及鼠標(biāo)的按鍵情況(左鍵、右鍵和沒(méi)有按鍵)2) int setMousePos(int x , int y), 設(shè)置鼠標(biāo)的位置,將鼠標(biāo)指針設(shè)置在(x,y)表示的坐標(biāo)位置;(3) void DrawMouse(float x,float y), 繪制鼠標(biāo) /*獲取鼠標(biāo)狀態(tài)函數(shù)*/int mouseStatus(int* x,int* y){ /*定義兩個(gè)寄存器變量,分別存儲(chǔ)入口參數(shù)和出口參數(shù)*/ union REGS inregs,outregs; int status; status=NO_PRESSED; /*入口參數(shù)AH=3,讀取鼠標(biāo)位置及其按鈕狀態(tài)*/ inregs.x.ax=3; int86(0x33,&inregs,&outregs); /*CX表示水平位置,DX表示垂直位置*/ *x=outregs.x.cx; *y=outregs.x.dx; /*BX表示按鍵狀態(tài)*/ if(outregs.x.bx&1) status=LEFT_PRESSED; else if(outregs.x.bx&2) status=RIGHT_PRESSED; return (status);}/*設(shè)置鼠標(biāo)指針位置函數(shù)*/int setMousePos(int x,int y){ union REGS inregs,outregs; /*入口參數(shù)AH=4,設(shè)置鼠標(biāo)指針位置*/ inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y; int86(0x33,&inregs,&outregs);}/*繪制鼠標(biāo)函數(shù)*/void DrawMouse(float x,float y){ line(x,y,x+5,y+15); line(x,y,x+15,y+5); line(x+5,y+15,x+15,y+5); line(x+11,y+9,x+21,y+19); line(x+9,y+11,x+19,y+21); line(x+22,y+19,x+20,y+21);}4.5圖形繪制模塊圖形繪制模塊是本程序的核心部分,主要包括繪制直線、繪制矩形、繪制圓行和繪制Bezier曲線。
1) 繪制直線繪制直線由函數(shù)DrawLine()實(shí)現(xiàn),該函數(shù)實(shí)現(xiàn)了直線的繪制、調(diào)整(包括移動(dòng)、旋轉(zhuǎn)和縮放)功能其實(shí)現(xiàn)流程可參見(jiàn)圖13.2 /*繪制直線函數(shù)*/void DrawLine(){ int x0,y0,x1,y1; int last_x=0,last_y=0; int endFlag=0; int key; int temStartx,temStarty,temEndx,temEndy; int increment_x,increment_y,angle; DrawMouse(last_x,last_y); while(1) { /*右鍵結(jié)束畫直線*/ while((mouseStatus(&x1,&y1)==RIGHT_PRESSED)) endFlag=1; if(endFlag==1) break; /*鼠標(biāo)移動(dòng),沒(méi)有單擊,僅僅畫移動(dòng)的鼠標(biāo)*/ while(mouseStatus(&x1,&y1) == NO_PRESSED) { if(last_x!=x1||last_y!=y1) { DrawMouse(last_x,last_y); DrawMouse(x1,y1); last_x=x1; last_y=y1; } } /*單擊左鍵后,開(kāi)始畫直線*/ if(mouseStatus(&x0,&y0)==LEFT_PRESSED) { DrawMouse(last_x,last_y); line(x0,y0,x1,y1); last_x=x1; last_y=y1; /*拉動(dòng)過(guò)程中,畫直線和鼠標(biāo)*/ while(mouseStatus(&x1, &y1)==LEFT_PRESSED) { if(last_x!=x1||last_y!=y1) { line(x0,y0,last_x,last_y); line(x0,y0,x1,y1); last_x=x1; last_y=y1; } } /*松開(kāi)左鍵后,畫直線完成,記錄直線的起始位置*/ lineStartx=x0; lineStarty=y0; lineEndx=x1; lineEndy=y1; while(1) { /*從鍵盤獲取鍵值,開(kāi)始操作(移動(dòng)、放大、縮小、旋轉(zhuǎn))直線*/ key=bioskey(0); /*ESC鍵,退出操作*/ if(key==ESC) break; /*旋轉(zhuǎn)*/ if(key==SPACE) { /*計(jì)算旋轉(zhuǎn)中心*/ /*如果直線示傾斜的*/ if((lineStarty!=lineEndy)&& (lineStartx!=lineEndx)) { Centx=(lineEndx-lineStartx)/2+lineStartx; Centy=(lineEndy-lineStarty)/2+lineStarty; } /*如果直線是豎直的*/ if(lineStarty==lineEndy) { Centx=(lineEndx-lineStartx)/2+lineStartx; Centy=lineStarty; } /*如果直線是水平的*/ if(lineStartx==lineEndx) { Centx=lineStartx; Centy=(lineEndy-lineStarty)/2+lineStarty; } temStartx=lineStartx; temStarty=lineStarty; temEndx=lineEndx; temEndy=lineEndy; /*旋轉(zhuǎn)不能超過(guò)邊界*/ if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { /*清除原有的直線*/ setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*計(jì)算旋轉(zhuǎn)30度后的起點(diǎn)坐標(biāo)*/ lineStartx=(temStartx-Centx)*cos(pi/6)-(temStarty-Centy)*sin(pi/6)+Centx; lineEndx=(temEndx-Centx)*cos(pi/6)-(temEndy-Centy)*sin(pi/6)+Centx; /*計(jì)算旋轉(zhuǎn)30度后的終點(diǎn)坐標(biāo)*/ lineStarty=(temStartx-Centx)*sin(pi/6)+(temStarty-Centy)*cos(pi/6)+Centy; lineEndy=(temEndx-Centx)*sin(pi/6)+(temEndy-Centy)*cos(pi/6)+Centy; temStartx=lineStartx; temStarty=lineStarty; temEndx=lineEndx; temEndy=lineEndy; /*繪制旋轉(zhuǎn)后的直線*/ line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*左移直線*/ if(key==LEFT) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*起始的橫坐標(biāo)減小*/ lineStartx-=5; lineEndx-=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*右移直線*/ if(key==RIGHT) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*起始的橫坐標(biāo)增加*/ lineStartx+=5; lineEndx+=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*下移直線*/ if(key==DOWN) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*起始的縱坐標(biāo)增加*/ lineStarty+=5; lineEndy+=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*上移直線*/ if(key==UP) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*起始的縱坐標(biāo)減小*/ lineStarty-=5; lineEndy-=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*放大直線*/ if(key==PAGEUP) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*如果直線是傾斜的*/ if((lineStarty!=lineEndy)&& (lineStartx!=lineEndx)) { /*計(jì)算直線的傾角*/ angle=atan((fabs(lineEndy-lineStarty))/(fabs(lineEndx-lineStartx))); /*計(jì)算水平增量*/ increment_x=cos(angle)*2; /*計(jì)算垂直增量*/ increment_y=sin(angle)*2; /*計(jì)算放大后的起始坐標(biāo)*/ if(lineStartx