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



計算機圖形學(xué)綜合實驗設(shè)計 ——用C語言實現(xiàn)畫圖板的功能學(xué) 院:信息管理學(xué)院 專 業(yè):計算機科學(xué)與技術(shù)姓 名:趙 某某 學(xué)號:****08030132計算機圖形學(xué)綜合實驗設(shè)計 ————畫圖板Windows系統(tǒng)自帶的畫圖板簡單靈巧,為用戶的小型圖形開發(fā)工作帶來了很多便利本實驗完全利用C語言開發(fā)了一個畫圖板,該畫圖板具有畫圖、調(diào)整圖形大小與方位、保存與打開文件等基本圖能一.設(shè)計目的利用C語言完成了一個Windows應(yīng)用程序的開發(fā)——畫圖板,該畫圖板能實現(xiàn)基本的圖形操作功能通過本次實驗,應(yīng)該了解怎么將像素寫入文件、怎么從文件中讀取像素;了解直線、矩形、圓和Bezier曲線等圖形的繪制原理、旋轉(zhuǎn)原理、移動院里和縮放原理等二.功能描述本實驗利用C語言編程實現(xiàn)的畫圖板,具有基本的畫圖功能、圖形操作功能和文件保存打開功能等1)圖形繪制功能(1)繪制直線:能繪制任意角度的直線,能實現(xiàn)直線的旋轉(zhuǎn)、伸長、縮短和上下左右移動。
2)繪制矩形:能繪制任意大?。ó嫴挤秶鷥?nèi))的矩形,能實現(xiàn)矩形的放大、縮小和上下左右移動3)繪制圓形:能繪制任意半徑大小(畫布范圍內(nèi))的圓形,能實現(xiàn)圓形的放大和縮小4)繪制Bezier曲線:能根據(jù)屏幕上的點(單擊鼠標后產(chǎn)生的點)繪制出Bezier曲線2)文件處理功能(1)保存:能保存畫布中的所有圖形到指定的文件2)加載:能打開指定的文件,將其內(nèi)容加載到畫布中3)用戶幫助功能顯示用戶使用指南,包括各種圖形的繪制方法和操作方法等三. 總體設(shè)計1. 系統(tǒng)模塊圖本系統(tǒng)包括4個模塊,分別是圖形繪制模塊、鼠標控制模塊、功能控制模塊和保存加載模塊.(1)圖形繪制模塊該模塊包括圖形的繪制和操作功能,主要有繪制直線、移動直線、縮放和旋轉(zhuǎn)直線;繪制矩形、移動和縮放矩形;繪制和縮放圓形;繪制Bezier曲線2)鼠標控制模塊該模塊主要實現(xiàn)鼠標狀態(tài)的獲取、鼠標位置的設(shè)置,以及鼠標的繪制等3)功能控制模塊該模塊實現(xiàn)的功能包括輸出中文、填充像素和顯示用戶幫助4)保存加載模塊該模塊將像素保存到指定文件和從指定文件中讀取像素到畫布2.數(shù)據(jù)結(jié)構(gòu)設(shè)計● int Rx,Ry,R:分別表示所畫圓形的圓心的橫坐標、縱坐標,以及圓的半徑。
● int TOPx,TOPy,BOTTOMx,BOTTOMy:分別表示所畫矩形的左上角的橫坐標、縱坐標,以及右下角的橫坐標、縱坐標● int Centx,Centy:表示直線或者矩形旋轉(zhuǎn)中心點的橫坐標和縱坐標● int lineStartx,lineStarty,lineEndx,lineEndy:分別表示直線的起點橫坐標、縱坐標,以及終點的橫坐標、縱坐標● int linePoint_x[20],linePoint_y[20]:這兩個數(shù)組用于在畫Bezier曲線時存儲所選點的橫坐標和縱坐標3.函數(shù)功能描述 1) outChinese()函數(shù)原型: void outChinese(char*mat,int x,int y,int color)本程序中雖然有中文顯示,但是顯示的中文不多,所以就沒有加載中文字庫,而是生成字模信息來建立一個小型字庫,以此來減輕程序“負擔” outChinese()函數(shù)根據(jù)點陣信息顯示中文,其中mat 為字模指針,matisize 為點陣大小,x和y表示起始坐標,color表示顯示的顏色2) fill()函數(shù)原型: void fill(int startx,int starty,int endy, int color)Fill()函數(shù)用于以指定的顏色填充指定的區(qū)域。
其中 startx、starty 表示填充區(qū)域的左上角橫、縱坐標,endx、endy表示填充區(qū)域的右下角的橫、縱坐標,color 表示填充的顏色該函數(shù)調(diào)用系統(tǒng)畫圖函數(shù)putpixel()來實現(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ù)用于打開已有的圖形用戶首先輸入打開文件的文件名,然后將文件中的像素輸入到畫布中打開完畢將提示用戶如果打開過程中出現(xiàn)錯誤,如沒有找到指定的文件等,也將顯示錯誤信息6) mouseStatus()函數(shù)原型: int mouseStatus(int*x,int*y)mouseStatus()函數(shù)用于獲取鼠標的狀態(tài),包括鼠標指針所處的橫坐標、縱坐標,以及鼠標的按鍵情況中斷的入口參數(shù)AH為03H,出口參數(shù)BH表示鼠標按鍵狀態(tài),位0為1表示按下左鍵,位1為1表示按下右鍵,位2為1表示按下中鍵;CX表示水平位置,DX表示垂直位置。
函數(shù)中傳遞的指針參數(shù)x、y 分別用來接收鼠標指針的水平位置和垂直位置 7)setMousePos()函數(shù)原型:int setMosePos(int x,int y)setMousePos()函數(shù)用來設(shè)置鼠標的位置X、y分別表示預(yù)設(shè)置的橫坐標和縱坐標這里中斷的入口參數(shù)AH為1,分別把x和y賦給寄存器CX和DX8)DrawMouse()函數(shù)原型:voidDrawMouse(float x,float y)DrawMouse()函數(shù)用于繪制鼠標X、y分別表示鼠標指針所處的位置9)DrawLine()函數(shù)原型:void DrawLine()DrawLine()函數(shù)用于繪制直線單擊鼠標左鍵,捕獲鼠標指針位置,并以此為起點開始畫直線,拖動鼠標,松開鼠標結(jié)束繪制然后可以通過鍵盤來調(diào)整直線的位置、大小等10) DrawRectangle()函數(shù)原型:void DrawRectangle()DrawRectangle()函數(shù)用于繪制矩形其繪制方法與直線的繪制方法一致11)LineToCircle()函數(shù)原型:void LineToCircle(int x0,int y0,int r)LineToCircle()函數(shù)實現(xiàn)的是直線法生成圓。
x0、y0表示圓心,r表示半徑直線法生成圓的相關(guān)知識讀者可查閱圖形學(xué)資料12)DrawCircle()函數(shù)原型:void DrawCircle()DrawCircle()函數(shù)實現(xiàn)的是畫圓功能,該函數(shù)是調(diào)用LineToCircle()函數(shù)來實現(xiàn)的13)factorial()函數(shù)原型:void factorial(int n)factorial()函數(shù)用于求階乘,n表示需要求階乘的函數(shù)求階乘的方法很多,本程序中使用的是比較原始的方法,即從n依次乘到1,也可以用遞歸來實現(xiàn),讀者可以自行設(shè)計14)berFunction()函數(shù)原型:float berFunction(int I,int n,double t)berFunction()函數(shù)是伯恩斯坦基函數(shù)的計算,該函數(shù)調(diào)用了前面的階乘函數(shù)factorial().15)DrawBezier()函數(shù)原型:void DrawBezier()DrawBezier()?函數(shù)實現(xiàn)畫Bezier曲線,該函數(shù)調(diào)用了berFunction()函數(shù)Bezier曲線的繪制涉及到數(shù)學(xué)知識,讀者可查閱相關(guān)資料4.程序?qū)崿F(xiàn)4.1預(yù)處理程序預(yù)處理包括頭文件的加載、常量的定義和全局變量的定義,以及點陣字模的定義。
include
/char zhi16K[]={/* 以下是 '直' 的 16點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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點陣楷體_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控制模塊 功能控制模塊主要實現(xiàn)根據(jù)點陣信息顯示中文功能、填充屏幕功能和顯示用戶指南功能,分別由函數(shù)outChinese()、fill()和showHelp()來實現(xiàn)。
1) void outChinese(char*mat,int matsize,int x,int y,int color),根據(jù)定義的點陣字模數(shù)組顯示中文2) void fill(int startx,int starty,int endx,int endy,int color),在指定的區(qū)域用指定的顏色來填充3) void showHelp(),顯示用戶使用指南,包括直線、矩形、圓形和Bezier曲線的繪制方法 /*根據(jù)點陣信息顯示中文函數(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()來實現(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); /*以讀寫的方式打開文件*/ 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!");} /*打開函數(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); /*打開指定的文件*/ 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 !"); } /*打開失敗*/ else { fill(0,447,630,477,2); outtextxy(260,455,"Failed to open file!"); } fclose(fp);}4.4鼠標控制模塊鼠標控制模塊實現(xiàn)的是對鼠標的操作,包括鼠標狀態(tài)的獲取、鼠標位置的設(shè)置和繪制鼠標,著幾個功能分別由函數(shù) mouseStatus()、setMousePos()和 drawMouse()來實現(xiàn)。
1) int mouseStatus(int* x, int* y), 獲取鼠標的位置,包括水平位置和垂直位置,以及鼠標的按鍵情況(左鍵、右鍵和沒有按鍵)2) int setMousePos(int x , int y), 設(shè)置鼠標的位置,將鼠標指針設(shè)置在(x,y)表示的坐標位置;(3) void DrawMouse(float x,float y), 繪制鼠標 /*獲取鼠標狀態(tài)函數(shù)*/int mouseStatus(int* x,int* y){ /*定義兩個寄存器變量,分別存儲入口參數(shù)和出口參數(shù)*/ union REGS inregs,outregs; int status; status=NO_PRESSED; /*入口參數(shù)AH=3,讀取鼠標位置及其按鈕狀態(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è)置鼠標指針位置函數(shù)*/int setMousePos(int x,int y){ union REGS inregs,outregs; /*入口參數(shù)AH=4,設(shè)置鼠標指針位置*/ inregs.x.ax=4; inregs.x.cx=x; inregs.x.dx=y; int86(0x33,&inregs,&outregs);}/*繪制鼠標函數(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()實現(xiàn),該函數(shù)實現(xiàn)了直線的繪制、調(diào)整(包括移動、旋轉(zhuǎn)和縮放)功能其實現(xià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; /*鼠標移動,沒有單擊,僅僅畫移動的鼠標*/ 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; } } /*單擊左鍵后,開始畫直線*/ if(mouseStatus(&x0,&y0)==LEFT_PRESSED) { DrawMouse(last_x,last_y); line(x0,y0,x1,y1); last_x=x1; last_y=y1; /*拉動過程中,畫直線和鼠標*/ 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; } } /*松開左鍵后,畫直線完成,記錄直線的起始位置*/ lineStartx=x0; lineStarty=y0; lineEndx=x1; lineEndy=y1; while(1) { /*從鍵盤獲取鍵值,開始操作(移動、放大、縮小、旋轉(zhuǎn))直線*/ key=bioskey(0); /*ESC鍵,退出操作*/ if(key==ESC) break; /*旋轉(zhuǎn)*/ if(key==SPACE) { /*計算旋轉(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)不能超過邊界*/ if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { /*清除原有的直線*/ setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*計算旋轉(zhuǎn)30度后的起點坐標*/ lineStartx=(temStartx-Centx)*cos(pi/6)-(temStarty-Centy)*sin(pi/6)+Centx; lineEndx=(temEndx-Centx)*cos(pi/6)-(temEndy-Centy)*sin(pi/6)+Centx; /*計算旋轉(zhuǎn)30度后的終點坐標*/ 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); /*起始的橫坐標減小*/ 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); /*起始的橫坐標增加*/ 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); /*起始的縱坐標增加*/ 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); /*起始的縱坐標減小*/ 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)) { /*計算直線的傾角*/ angle=atan((fabs(lineEndy-lineStarty))/(fabs(lineEndx-lineStartx))); /*計算水平增量*/ increment_x=cos(angle)*2; /*計算垂直增量*/ increment_y=sin(angle)*2; /*計算放大后的起始坐標*/ if(lineStartx
