秋霞电影网午夜鲁丝片无码,真人h视频免费观看视频,囯产av无码片毛片一级,免费夜色私人影院在线观看,亚洲美女综合香蕉片,亚洲aⅴ天堂av在线电影猫咪,日韩三级片网址入口

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

上傳人:仙*** 文檔編號:253592386 上傳時間:2025-03-16 格式:DOC 頁數(shù):35 大?。?31KB
收藏 版權(quán)申訴 舉報 下載
計算機圖形學(xué)綜合實驗設(shè)計——用C語言實現(xiàn)畫圖板的功能_第1頁
第1頁 / 共35頁
計算機圖形學(xué)綜合實驗設(shè)計——用C語言實現(xiàn)畫圖板的功能_第2頁
第2頁 / 共35頁
計算機圖形學(xué)綜合實驗設(shè)計——用C語言實現(xiàn)畫圖板的功能_第3頁
第3頁 / 共35頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《計算機圖形學(xué)綜合實驗設(shè)計——用C語言實現(xiàn)畫圖板的功能》由會員分享,可在線閱讀,更多相關(guān)《計算機圖形學(xué)綜合實驗設(shè)計——用C語言實現(xiàn)畫圖板的功能(35頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、 計算機圖形學(xué)綜合實驗設(shè)計 ——用C語言實現(xiàn)畫圖板的功能 學(xué) 院:信息管理學(xué)院 專 業(yè):計算機科學(xué)與技術(shù) 姓 名:趙 某某 學(xué)號:****08030132 計算機圖形學(xué)綜合實驗設(shè)計 ————畫圖板 Windows系統(tǒng)自帶的畫圖板簡單靈巧,為用戶的小型圖形開發(fā)工作帶來了很多便利。本實驗完全利用C語言開

2、發(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)繪制矩形:能繪制任意大小(畫布范

3、圍內(nèi))的矩形,能實現(xiàn)矩形的放大、縮小和上下左右移動。 (3)繪制圓形:能繪制任意半徑大?。ó嫴挤秶鷥?nèi))的圓形,能實現(xiàn)圓形的放大和縮小。 (4)繪制Bezier曲線:能根據(jù)屏幕上的點(單擊鼠標(biāo)后產(chǎn)生的點)繪制出Bezier曲線。 2)文件處理功能 (1)保存:能保存畫布中的所有圖形到指定的文件。 (2)加載:能打開指定的文件,將其內(nèi)容加載到畫布中。 3)用戶幫助功能 顯示用戶使用指南,包括各種圖形的繪制方法和操作方法等。 三. 總體設(shè)計 1. 系統(tǒng)模塊圖 本系統(tǒng)包括4個模塊,分別是圖形繪制模塊、鼠標(biāo)控制模塊、功能控制模塊和保存加載模塊. (1)圖形繪制模塊。該模塊包括圖形的

4、繪制和操作功能,主要有繪制直線、移動直線、縮放和旋轉(zhuǎn)直線;繪制矩形、移動和縮放矩形;繪制和縮放圓形;繪制Bezier曲線。 (2)鼠標(biāo)控制模塊。該模塊主要實現(xiàn)鼠標(biāo)狀態(tài)的獲取、鼠標(biāo)位置的設(shè)置,以及鼠標(biāo)的繪制等。 (3)功能控制模塊。該模塊實現(xiàn)的功能包括輸出中文、填充像素和顯示用戶幫助。 (4)保存加載模塊。該模塊將像素保存到指定文件和從指定文件中讀取像素到畫布。 2.?dāng)?shù)據(jù)結(jié)構(gòu)設(shè)計 ● int Rx,Ry,R:分別表示所畫圓形的圓心的橫坐標(biāo)、縱坐標(biāo),以及圓的半徑。 ● int TOPx,TOPy,BOTTOMx,BOTTOMy:分別表示所畫矩形的左上角的橫坐標(biāo)、縱坐標(biāo),以及右下角的橫坐

5、標(biāo)、縱坐標(biāo)。 ● int Centx,Centy:表示直線或者矩形旋轉(zhuǎn)中心點的橫坐標(biāo)和縱坐標(biāo)。 ● int lineStartx,lineStarty,lineEndx,lineEndy:分別表示直線的起點橫坐標(biāo)、縱坐標(biāo),以及終點的橫坐標(biāo)、縱坐標(biāo)。 ● int linePoint_x[20],linePoint_y[20]:這兩個數(shù)組用于在畫Bezier曲線時存儲所選點的橫坐標(biāo)和縱坐標(biāo)。 3.函數(shù)功能描述 1) outChinese() 函數(shù)原型: void outChinese(char*mat,int x,int y,int color) 本程序中雖然

6、有中文顯示,但是顯示的中文不多,所以就沒有加載中文字庫,而是生成字模信息來建立一個小型字庫,以此來減輕程序“負(fù)擔(dān)” 。 outChinese()函數(shù)根據(jù)點陣信息顯示中文,其中mat 為字模指針,matisize 為點陣大小,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 表示

7、填充的顏色。該函數(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ù)用于打開已有的圖形。用戶首先輸入打開文件的文件名,然后將文件中的像素輸入到畫布中。打開完畢

8、將提示用戶。如果打開過程中出現(xiàn)錯誤,如沒有找到指定的文件等,也將顯示錯誤信息。 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 分別用來接收鼠標(biāo)指針的水平位置和垂直位置。 7)setMousePos() 函數(shù)原型:int setMosePo

9、s(int x,int y) setMousePos()函數(shù)用來設(shè)置鼠標(biāo)的位置。X、y分別表示預(yù)設(shè)置的橫坐標(biāo)和縱坐標(biāo)。這里中斷的入口參數(shù)AH為1,分別把x和y賦給寄存器CX和DX。 8)DrawMouse() 函數(shù)原型:voidDrawMouse(float x,float y) DrawMouse()函數(shù)用于繪制鼠標(biāo)。X、y分別表示鼠標(biāo)指針?biāo)幍奈恢谩? 9)DrawLine() 函數(shù)原型:void DrawLine() DrawLine()函數(shù)用于繪制直線。單擊鼠標(biāo)左鍵,捕獲鼠標(biāo)指針位置,并以此為起點開始畫直線,拖動鼠標(biāo),松開鼠標(biāo)結(jié)束繪制。然后可以通過鍵盤來調(diào)整直線的位置、大小

10、等。 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)用LineT

11、oCircle()函數(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 DrawBez

12、ier() 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 #include #include #include #include #include #include #include

13、> /*定義常量*/ /*向上翻頁移鍵*/ #define PAGEUP 0x4900 /*向下翻頁移鍵*/ #define PAGEDOWN 0x5100 /*Escape鍵*/ #define ESC 0x011b /*左移鍵*/ #define LEFT 0x4b00 /*右移鍵*/ #define RIGHT 0x4d00 /*下移鍵*/ #define DOWN 0x5000 /*上移鍵*/ #define UP 0x4800 /*空格鍵*/ #define SPACE 0x3920 #define NO_PRESSED 0

14、 #define LEFT_PRESSED 1 #define RIGHT_PRESSED 2 #define pi 3.1415926 /*定義全局變量*/ int Rx,Ry,R; int TOPx,TOPy,BOTTOMx,BOTTOMy; int Centx,Centy; int lineStartx,lineStarty,lineEndx,lineEndy; int linePoint_x[20],linePoint_y[20]; /*這里的字模數(shù)組均由“點陣字模工具”生成,你可以用你自己需要的點陣信息來 替換示例

15、中的字模信息,注意字模大小要一致,否則顯示會出問題。*/ 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、的 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,0x

17、78,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,

18、 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,0

19、x00,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[]={ /*

20、以下是 '屏' 的 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,0xF

21、0,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,0x0

22、8,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

23、,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[]=

24、{ /* 以下是 '幫' 的 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,

25、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

26、,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

27、 -1)/8+1 for(j=0;j>k)) /*測試為1的位則顯示*/ putpixel(x + i * 8 + k, y + j, color); } /*填充函數(shù)*/ void fill(int startx,int starty,int endx,int endy,int color) { int i,j;

28、for(i=startx;i<=endx;i++) for(j=starty;j<=endy;j++) /*在指定位置以指定顏色畫一像素*/ putpixel(i,j,color); } /*顯示用戶幫助函數(shù)*/ void showHelp() { setcolor(14); outtextxy(45,50,"Line:"); setcolor(WHITE); outtextxy(45,50," 1 Press left button to star

29、t until to line end."); outtextxy(45,65," 2 Use UP,DOWN,LEFT,RIGHT keys to move it."); outtextxy(45,80," 3 Use PAGEUP key to enlarge it, and PAGEDOWN key to shrink it."); outtextxy(45,95," 4 Use SPACE key to rotate it."); setcolor(14); outtextxy(45,120,"Rect

30、angle:"); setcolor(WHITE); outtextxy(45,120," 1 Press left button to start until to right corner."); outtextxy(45,135," 2 Use UP,DOWN,LEFT,RIGHT keys to move it."); outtextxy(45,150," 3 Use PAGEUP key to enlarge it, and PAGEDOWN key to shrink it.");

31、 setcolor(14); outtextxy(45,170,"Circle:"); setcolor(WHITE); outtextxy(45,170," 1 Press left button to start until to end."); outtextxy(45,185," 2 Use PAGEUP key to enlarge it, and PAGEDOWN key to shrink it."); setcolor(14); outtextxy(45,205,"B

32、ezier:"); setcolor(WHITE); outtextxy(45,205," Press left button to start, and right button to end."); outtextxy(45,230,"Press ESC key to stop the operation function."); outtextxy(45,245,"Press right button to end the drawing works."); outtextxy(45,260,"Press any k

33、ey to continue......"); getch(); fill(40,40,625,270,0); } 4.3保存加載模塊 顧名思義保存加載模塊實現(xiàn)的是保存功能和加載功能。分別由函數(shù) save() 和 load()來實現(xiàn)。 (1) void save(), 保存畫布中的像素到指定文件。 (2) void load(), 將指定文件中的像素加載到畫布中。 /*保存參數(shù)*/ void save() { int i,j; FILE *fp; char fileName[20]; fill(0,4

34、47,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); } outt

35、extxy(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];

36、 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..."); /*從文件中

37、讀出像素*/ 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 ope

38、n file!"); } fclose(fp); } 4.4鼠標(biāo)控制模塊 鼠標(biāo)控制模塊實現(xiàn)的是對鼠標(biāo)的操作,包括鼠標(biāo)狀態(tài)的獲取、鼠標(biāo)位置的設(shè)置和繪制鼠標(biāo),著幾個功能分別由函數(shù) mouseStatus()、setMousePos()和 drawMouse()來實現(xiàn)。 (1) int mouseStatus(int* x, int* y), 獲取鼠標(biāo)的位置,包括水平位置和垂直位置,以及鼠標(biāo)的按鍵情況(左鍵、右鍵和沒有按鍵)。 (2) int setMousePos(int x , int y), 設(shè)置鼠標(biāo)的位置,將鼠標(biāo)指針設(shè)置在(x,y)表示的坐標(biāo)位置; (3)

39、 void DrawMouse(float x,float y), 繪制鼠標(biāo)。 /*獲取鼠標(biāo)狀態(tài)函數(shù)*/ int mouseStatus(int* x,int* y) { /*定義兩個寄存器變量,分別存儲入口參數(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表示水

40、平位置,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;

41、 /*入口參數(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

42、+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;

43、 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)移動,沒有單擊,

44、僅僅畫移動的鼠標(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; } } /*單

45、擊左鍵后,開始畫直線*/ if(mouseStatus(&x0,&y0)==LEFT_PRESSED) { DrawMouse(last_x,last_y); line(x0,y0,x1,y1); last_x=x1; last_y=y1; /*拉動過程中,畫直線和鼠標(biāo)*/ while(mouseStatus(&x1, &y1)==LEFT_PRESSED) {

46、 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; } } /*松開左鍵后,畫直線完成,記錄直線的起始位置*/ lineSt

47、artx=x0; lineStarty=y0; lineEndx=x1; lineEndy=y1; while(1) { /*從鍵盤獲取鍵值,開始操作(移動、放大、縮小、旋轉(zhuǎn))直線*/ key=bioskey(0); /*ESC鍵,退出操作*/ if(key==ESC) break;

48、 /*旋轉(zhuǎn)*/ if(key==SPACE) { /*計算旋轉(zhuǎn)中心*/ /*如果直線示傾斜的*/ if((lineStarty!=lineEndy)&& (lineStartx!=lineEndx)) { Centx=(lineEndx-lineStartx)/2+line

49、Startx; Centy=(lineEndy-lineStarty)/2+lineStarty; } /*如果直線是豎直的*/ if(lineStarty==lineEndy) { Centx=(lineEndx-lineStartx)/2+lineStartx;

50、 Centy=lineStarty; } /*如果直線是水平的*/ if(lineStartx==lineEndx) { Centx=lineStartx; Centy=(lineEndy-lineStarty)/2+lineStarty; }

51、 temStartx=lineStartx; temStarty=lineStarty; temEndx=lineEndx; temEndy=lineEndy; /*旋轉(zhuǎn)不能超過邊界*/ if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) {

52、 /*清除原有的直線*/ setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*計算旋轉(zhuǎn)30度后的起點坐標(biāo)*/ lineStartx=(temStartx-Centx)*cos(pi/6)-(temStarty-Centy)*sin(pi/6)+Centx

53、; lineEndx=(temEndx-Centx)*cos(pi/6)-(temEndy-Centy)*sin(pi/6)+Centx; /*計算旋轉(zhuǎn)30度后的終點坐標(biāo)*/ lineStarty=(temStartx-Centx)*sin(pi/6)+(temStarty-Centy)*cos(pi/6)+Centy; lineEndy=(temEndx-Centx)*sin(pi/6)+(

54、temEndy-Centy)*cos(pi/6)+Centy; temStartx=lineStartx; temStarty=lineStarty; temEndx=lineEndx; temEndy=lineEndy; /*繪制旋轉(zhuǎn)后的直線*/ line(lineStartx,l

55、ineStarty,lineEndx,lineEndy); } } /*左移直線*/ if(key==LEFT) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwrit

56、emode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*起始的橫坐標(biāo)減小*/ lineStartx-=5; lineEndx-=5; line(lineStartx,lineStarty,lineEndx,lineEndy); }

57、 } /*右移直線*/ if(key==RIGHT) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStar

58、tx,lineStarty,lineEndx,lineEndy); /*起始的橫坐標(biāo)增加*/ lineStartx+=5; lineEndx+=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*下移直線*/

59、 if(key==DOWN) { if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy);

60、 /*起始的縱坐標(biāo)增加*/ lineStarty+=5; lineEndy+=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*上移直線*/ if(key==UP) {

61、 if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*起始的縱坐標(biāo)減小*/ lineStarty-=5;

62、 lineEndy-=5; line(lineStartx,lineStarty,lineEndx,lineEndy); } } /*放大直線*/ if(key==PAGEUP) { if(lineStartx>=10 && lineStarty>=40 && lineEnd

63、x <=620 && lineEndy <=445) { setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*如果直線是傾斜的*/ if((lineStarty!=lineEndy)&& (lineStartx!=lineEndx))

64、 { /*計算直線的傾角*/ angle=atan((fabs(lineEndy-lineStarty))/(fabs(lineEndx-lineStartx))); /*計算水平增量*/ increment_x=cos(angle)*2; /*計算垂直增量*/

65、 increment_y=sin(angle)*2; /*計算放大后的起始坐標(biāo)*/ if(lineStartx

66、 lineEndx+=increment_x; lineEndy+=increment_y; } if(lineStartx>lineEndx) { lineEndx-=increment_x; lineEndy-=increment_y; lineStartx+=increment_x; lineStarty+=increment_y; }

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!