计算机图形学综合实验设计——用C语言实现画图板的功能



《计算机图形学综合实验设计——用C语言实现画图板的功能》由会员分享,可在线阅读,更多相关《计算机图形学综合实验设计——用C语言实现画图板的功能(35页珍藏版)》请在装配图网上搜索。
1、 计算机图形学综合实验设计 ——用C语言实现画图板的功能 学 院:信息管理学院 专 业:计算机科学与技术 姓 名:赵 某某 学号:****08030132 计算机图形学综合实验设计 ————画图板 Windows系统自带的画图板简单灵巧,为用户的小型图形开发工作带来了很多便利。本实验完全利用C语言开
2、发了一个画图板,该画图板具有画图、调整图形大小与方位、保存与打开文件等基本图能。 一.设计目的 利用C语言完成了一个Windows应用程序的开发——画图板,该画图板能实现基本的图形操作功能。通过本次实验,应该了解怎么将像素写入文件、怎么从文件中读取像素;了解直线、矩形、圆和Bezier曲线等图形的绘制原理、旋转原理、移动院里和缩放原理等。 二.功能描述 本实验利用C语言编程实现的画图板,具有基本的画图功能、图形操作功能和文件保存打开功能等。 1)图形绘制功能 (1)绘制直线:能绘制任意角度的直线,能实现直线的旋转、伸长、缩短和上下左右移动。 (2)绘制矩形:能绘制任意大小(画布范
3、围内)的矩形,能实现矩形的放大、缩小和上下左右移动。 (3)绘制圆形:能绘制任意半径大小(画布范围内)的圆形,能实现圆形的放大和缩小。 (4)绘制Bezier曲线:能根据屏幕上的点(单击鼠标后产生的点)绘制出Bezier曲线。 2)文件处理功能 (1)保存:能保存画布中的所有图形到指定的文件。 (2)加载:能打开指定的文件,将其内容加载到画布中。 3)用户帮助功能 显示用户使用指南,包括各种图形的绘制方法和操作方法等。 三. 总体设计 1. 系统模块图 本系统包括4个模块,分别是图形绘制模块、鼠标控制模块、功能控制模块和保存加载模块. (1)图形绘制模块。该模块包括图形的
4、绘制和操作功能,主要有绘制直线、移动直线、缩放和旋转直线;绘制矩形、移动和缩放矩形;绘制和缩放圆形;绘制Bezier曲线。 (2)鼠标控制模块。该模块主要实现鼠标状态的获取、鼠标位置的设置,以及鼠标的绘制等。 (3)功能控制模块。该模块实现的功能包括输出中文、填充像素和显示用户帮助。 (4)保存加载模块。该模块将像素保存到指定文件和从指定文件中读取像素到画布。 2.数据结构设计 ● int Rx,Ry,R:分别表示所画圆形的圆心的横坐标、纵坐标,以及圆的半径。 ● int TOPx,TOPy,BOTTOMx,BOTTOMy:分别表示所画矩形的左上角的横坐标、纵坐标,以及右下角的横坐
5、标、纵坐标。 ● int Centx,Centy:表示直线或者矩形旋转中心点的横坐标和纵坐标。 ● int lineStartx,lineStarty,lineEndx,lineEndy:分别表示直线的起点横坐标、纵坐标,以及终点的横坐标、纵坐标。 ● int linePoint_x[20],linePoint_y[20]:这两个数组用于在画Bezier曲线时存储所选点的横坐标和纵坐标。 3.函数功能描述 1) outChinese() 函数原型: void outChinese(char*mat,int x,int y,int color) 本程序中虽然
6、有中文显示,但是显示的中文不多,所以就没有加载中文字库,而是生成字模信息来建立一个小型字库,以此来减轻程序“负担” 。 outChinese()函数根据点阵信息显示中文,其中mat 为字模指针,matisize 为点阵大小,x和y表示起始坐标,color表示显示的颜色。 2) fill() 函数原型: void fill(int startx,int starty,int endy, int color) Fill()函数用于以指定的颜色填充指定的区域。其中 startx、starty 表示填充区域的左上角横、纵坐标,endx、endy表示填充区域的右下角的横、纵坐标,color 表示
7、填充的颜色。该函数调用系统画图函数putpixel()来实现。 3) showHelp() 函数原型:void showHelp() showHelp()函数用于显示用户使用指南。用户使用指南包括各种图行的绘制方法和调整方法等。 4) save() 函数原型:void save() Save()函数用于保存画布中的图形。用户首先输入保存文件的文件名,然后将画布中的像素写入文件,保存文件是以“.dat”结尾的。保存完毕将提示用户。 5) 函数原型: void load() load()函数用于打开已有的图形。用户首先输入打开文件的文件名,然后将文件中的像素输入到画布中。打开完毕
8、将提示用户。如果打开过程中出现错误,如没有找到指定的文件等,也将显示错误信息。 6) mouseStatus() 函数原型: int mouseStatus(int*x,int*y) mouseStatus()函数用于获取鼠标的状态,包括鼠标指针所处的横坐标、纵坐标,以及鼠标的按键情况。中断的入口参数AH为03H,出口参数BH表示鼠标按键状态,位0为1表示按下左键,位1为1表示按下右键,位2为1表示按下中键;CX表示水平位置,DX表示垂直位置。函数中传递的指针参数x、y 分别用来接收鼠标指针的水平位置和垂直位置。 7)setMousePos() 函数原型:int setMosePo
9、s(int x,int y) setMousePos()函数用来设置鼠标的位置。X、y分别表示预设置的横坐标和纵坐标。这里中断的入口参数AH为1,分别把x和y赋给寄存器CX和DX。 8)DrawMouse() 函数原型:voidDrawMouse(float x,float y) DrawMouse()函数用于绘制鼠标。X、y分别表示鼠标指针所处的位置。 9)DrawLine() 函数原型:void DrawLine() DrawLine()函数用于绘制直线。单击鼠标左键,捕获鼠标指针位置,并以此为起点开始画直线,拖动鼠标,松开鼠标结束绘制。然后可以通过键盘来调整直线的位置、大小
10、等。 10) DrawRectangle() 函数原型:void DrawRectangle() DrawRectangle()函数用于绘制矩形。其绘制方法与直线的绘制方法一致。 11)LineToCircle() 函数原型:void LineToCircle(int x0,int y0,int r) LineToCircle()函数实现的是直线法生成圆。x0、y0表示圆心,r表示半径。直线法生成圆的相关知识读者可查阅图形学资料。 12)DrawCircle() 函数原型:void DrawCircle() DrawCircle()函数实现的是画圆功能,该函数是调用LineT
11、oCircle()函数来实现的。 13)factorial() 函数原型:void factorial(int n) factorial()函数用于求阶乘,n表示需要求阶乘的函数。求阶乘的方法很多,本程序中使用的是比较原始的方法,即从n依次乘到1,也可以用递归来实现,读者可以自行设计。 14)berFunction() 函数原型:float berFunction(int I,int n,double t) berFunction()函数是伯恩斯坦基函数的计算,该函数调用了前面的阶乘函数factorial(). 15)DrawBezier() 函数原型:void DrawBez
12、ier()
DrawBezier() 函数实现画Bezier曲线,该函数调用了berFunction()函数。Bezier曲线的绘制涉及到数学知识,读者可查阅相关资料。
4.程序实现
4.1预处理
程序预处理包括头文件的加载、常量的定义和全局变量的定义,以及点阵字模的定义。
#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];
/*这里的字模数组均由“点阵字模工具”生成,你可以用你自己需要的点阵信息来
替换示例 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控制模块
功能控制模块主要实现根据点阵信息显示中文功能、填充屏幕功能和显示用户指南功能,分别由函数outChinese()、fill()和showHelp()来实现。
(1) void outChinese(char*mat,int matsize 26、,int x,int y,int color),根据定义的点阵字模数组显示中文。
(2) void fill(int startx,int starty,int endx,int endy,int color),在指定的区域用指定的颜色来填充。
(3) void showHelp(),显示用户使用指南,包括直线、矩形、圆形和Bezier曲线的绘制方法。
/*根据点阵信息显示中文函数* /
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);
}
/*显示用户帮助函数*/
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保存加载模块
顾名思义保存加载模块实现的是保存功能和加载功能。分别由函数 save() 和 load()来实现。
(1) void save(), 保存画布中的像素到指定文件。
(2) void load(), 将指定文件中的像素加载到画布中。
/*保存参数*/
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!");
}
/*打开函数*/
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鼠标控制模块
鼠标控制模块实现的是对鼠标的操作,包括鼠标状态的获取、鼠标位置的设置和绘制鼠标,着几个功能分别由函数 mouseStatus()、setMousePos()和 drawMouse()来实现。
(1) int mouseStatus(int* x, int* y), 获取鼠标的位置,包括水平位置和垂直位置,以及鼠标的按键情况(左键、右键和没有按键)。
(2) int setMousePos(int x , int y), 设置鼠标的位置,将鼠标指针设置在(x,y)表示的坐标位置;
(3) 39、 void DrawMouse(float x,float y), 绘制鼠标。
/*获取鼠标状态函数*/
int mouseStatus(int* x,int* y)
{
/*定义两个寄存器变量,分别存储入口参数和出口参数*/
union REGS inregs,outregs;
int status;
status=NO_PRESSED;
/*入口参数AH=3,读取鼠标位置及其按钮状态*/
inregs.x.ax=3;
int86(0x33,&inregs,&outregs);
/*CX表示水 40、平位置,DX表示垂直位置*/
*x=outregs.x.cx;
*y=outregs.x.dx;
/*BX表示按键状态*/
if(outregs.x.bx&1)
status=LEFT_PRESSED;
else if(outregs.x.bx&2)
status=RIGHT_PRESSED;
return (status);
}
/*设置鼠标指针位置函数*/
int setMousePos(int x,int y)
{
union REGS inregs,outregs; 41、
/*入口参数AH=4,设置鼠标指针位置*/
inregs.x.ax=4;
inregs.x.cx=x;
inregs.x.dx=y;
int86(0x33,&inregs,&outregs);
}
/*绘制鼠标函数*/
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) 绘制直线
绘制直线由函数DrawLine()实现,该函数实现了直线的绘制、调整(包括移动、旋转和缩放)功能。其实现流程可参见图13.2。
/*绘制直线函数*/
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)
{
/*右键结束画直线*/
while((mouseStatus(&x1,&y1)==RIGHT_PRESSED))
endFlag=1;
if(endFlag==1)
break;
/*鼠标移动,没有单击, 44、仅仅画移动的鼠标*/
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;
/*拉动过程中,画直线和鼠标*/
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)
{
/*从键盘获取键值,开始操作(移动、放大、缩小、旋转)直线*/
key=bioskey(0);
/*ESC键,退出操作*/
if(key==ESC)
break;
48、
/*旋转*/
if(key==SPACE)
{
/*计算旋转中心*/
/*如果直线示倾斜的*/
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;
/*旋转不能超过边界*/
if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445)
{ 52、
/*清除原有的直线*/
setwritemode(XOR_PUT);
line(lineStartx,lineStarty,lineEndx,lineEndy);
/*计算旋转30度后的起点坐标*/
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;
/*计算旋转30度后的终点坐标*/
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;
/*绘制旋转后的直线*/
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);
/*起始的横坐标减小*/
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);
/*起始的横坐标增加*/
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、 /*起始的纵坐标增加*/
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);
/*起始的纵坐标减小*/
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;
/*计算放大后的起始坐标*/
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: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。