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



《計算機圖形學(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 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 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專題黨課講稿:以高質(zhì)量黨建保障國有企業(yè)高質(zhì)量發(fā)展
- 廉政黨課講稿材料:堅決打好反腐敗斗爭攻堅戰(zhàn)持久戰(zhàn)總體戰(zhàn)涵養(yǎng)風(fēng)清氣正的政治生態(tài)
- 在新錄用選調(diào)生公務(wù)員座談會上和基層單位調(diào)研座談會上的發(fā)言材料
- 總工會關(guān)于2025年維護勞動領(lǐng)域政治安全的工作匯報材料
- 基層黨建工作交流研討會上的講話發(fā)言材料
- 糧食和物資儲備學(xué)習(xí)教育工作部署會上的講話發(fā)言材料
- 市工業(yè)園區(qū)、市直機關(guān)單位、市紀(jì)委監(jiān)委2025年工作計劃
- 檢察院政治部關(guān)于2025年工作計劃
- 辦公室主任2025年現(xiàn)實表現(xiàn)材料
- 2025年~村農(nóng)村保潔員規(guī)范管理工作方案
- 在深入貫徹中央8項規(guī)定精神學(xué)習(xí)教育工作部署會議上的講話發(fā)言材料4篇
- 開展深入貫徹規(guī)定精神學(xué)習(xí)教育動員部署會上的講話發(fā)言材料3篇
- 在司法黨組中心學(xué)習(xí)組學(xué)習(xí)會上的發(fā)言材料
- 國企黨委關(guān)于推動基層黨建與生產(chǎn)經(jīng)營深度融合工作情況的報告材料
- 副書記在2025年工作務(wù)虛會上的發(fā)言材料2篇