当前位置首页 > 高等教育 > 实验设计
搜柄,搜必应! 快速导航 | 使用教程

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

文档格式:DOC| 35 页|大小 231KB|2025-03-16 发布|举报 | 版权申诉
第1页
第2页
第3页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 35
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 计算机图形学综合实验设计 ——用C语言实现画图板的功能学 院:信息管理学院 专 业:计算机科学与技术姓 名:赵 某某 学号:****08030132计算机图形学综合实验设计 ————画图板Windows系统自带的画图板简单灵巧,为用户的小型图形开发工作带来了很多便利本实验完全利用C语言开发了一个画图板,该画图板具有画图、调整图形大小与方位、保存与打开文件等基本图能一.设计目的利用C语言完成了一个Windows应用程序的开发——画图板,该画图板能实现基本的图形操作功能通过本次实验,应该了解怎么将像素写入文件、怎么从文件中读取像素;了解直线、矩形、圆和Bezier曲线等图形的绘制原理、旋转原理、移动院里和缩放原理等二.功能描述本实验利用C语言编程实现的画图板,具有基本的画图功能、图形操作功能和文件保存打开功能等1)图形绘制功能(1)绘制直线:能绘制任意角度的直线,能实现直线的旋转、伸长、缩短和上下左右移动。

    2)绘制矩形:能绘制任意大小(画布范围内)的矩形,能实现矩形的放大、缩小和上下左右移动3)绘制圆形:能绘制任意半径大小(画布范围内)的圆形,能实现圆形的放大和缩小4)绘制Bezier曲线:能根据屏幕上的点(单击鼠标后产生的点)绘制出Bezier曲线2)文件处理功能(1)保存:能保存画布中的所有图形到指定的文件2)加载:能打开指定的文件,将其内容加载到画布中3)用户帮助功能显示用户使用指南,包括各种图形的绘制方法和操作方法等三. 总体设计1. 系统模块图本系统包括4个模块,分别是图形绘制模块、鼠标控制模块、功能控制模块和保存加载模块.(1)图形绘制模块该模块包括图形的绘制和操作功能,主要有绘制直线、移动直线、缩放和旋转直线;绘制矩形、移动和缩放矩形;绘制和缩放圆形;绘制Bezier曲线2)鼠标控制模块该模块主要实现鼠标状态的获取、鼠标位置的设置,以及鼠标的绘制等3)功能控制模块该模块实现的功能包括输出中文、填充像素和显示用户帮助4)保存加载模块该模块将像素保存到指定文件和从指定文件中读取像素到画布2.数据结构设计● int Rx,Ry,R:分别表示所画圆形的圆心的横坐标、纵坐标,以及圆的半径。

    ● int TOPx,TOPy,BOTTOMx,BOTTOMy:分别表示所画矩形的左上角的横坐标、纵坐标,以及右下角的横坐标、纵坐标● 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)本程序中虽然有中文显示,但是显示的中文不多,所以就没有加载中文字库,而是生成字模信息来建立一个小型字库,以此来减轻程序“负担” outChinese()函数根据点阵信息显示中文,其中mat 为字模指针,matisize 为点阵大小,x和y表示起始坐标,color表示显示的颜色2) fill()函数原型: void fill(int startx,int starty,int endy, int color)Fill()函数用于以指定的颜色填充指定的区域。

    其中 startx、starty 表示填充区域的左上角横、纵坐标,endx、endy表示填充区域的右下角的横、纵坐标,color 表示填充的颜色该函数调用系统画图函数putpixel()来实现3) showHelp()函数原型:void showHelp()showHelp()函数用于显示用户使用指南用户使用指南包括各种图行的绘制方法和调整方法等4) save()函数原型:void save()Save()函数用于保存画布中的图形用户首先输入保存文件的文件名,然后将画布中的像素写入文件,保存文件是以“.dat”结尾的保存完毕将提示用户5)函数原型: void load()load()函数用于打开已有的图形用户首先输入打开文件的文件名,然后将文件中的像素输入到画布中打开完毕将提示用户如果打开过程中出现错误,如没有找到指定的文件等,也将显示错误信息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 setMosePos(int x,int y)setMousePos()函数用来设置鼠标的位置X、y分别表示预设置的横坐标和纵坐标这里中断的入口参数AH为1,分别把x和y赋给寄存器CX和DX8)DrawMouse()函数原型:voidDrawMouse(float x,float y)DrawMouse()函数用于绘制鼠标X、y分别表示鼠标指针所处的位置9)DrawLine()函数原型:void DrawLine()DrawLine()函数用于绘制直线单击鼠标左键,捕获鼠标指针位置,并以此为起点开始画直线,拖动鼠标,松开鼠标结束绘制然后可以通过键盘来调整直线的位置、大小等10) DrawRectangle()函数原型:void DrawRectangle()DrawRectangle()函数用于绘制矩形其绘制方法与直线的绘制方法一致11)LineToCircle()函数原型:void LineToCircle(int x0,int y0,int r)LineToCircle()函数实现的是直线法生成圆。

    x0、y0表示圆心,r表示半径直线法生成圆的相关知识读者可查阅图形学资料12)DrawCircle()函数原型:void DrawCircle()DrawCircle()函数实现的是画圆功能,该函数是调用LineToCircle()函数来实现的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 DrawBezier()DrawBezier() 函数实现画Bezier曲线,该函数调用了berFunction()函数Bezier曲线的绘制涉及到数学知识,读者可查阅相关资料4.程序实现4.1预处理程序预处理包括头文件的加载、常量的定义和全局变量的定义,以及点阵字模的定义。

    include #include #include #include #include #include #include #include /*定义常量*//*向上翻页移键*/#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#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];/*这里的字模数组均由“点阵字模工具”生成,你可以用你自己需要的点阵信息来替换示例中的字模信息,注意字模大小要一致,否则显示会出问题。

    /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控制模块 功能控制模块主要实现根据点阵信息显示中文功能、填充屏幕功能和显示用户指南功能,分别由函数outChinese()、fill()和showHelp()来实现。

    1) void outChinese(char*mat,int matsize,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 -1)/8+1 for(j=0;j>k)) /*测试为1的位则显示*/ putpixel(x + i * 8 + k, y + j, color);}/*填充函数*/void fill(int startx,int starty,int endx,int endy,int color){ int i,j; 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 start 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,"Rectangle:"); 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."); 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,"Bezier:"); 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 key 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,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!");} /*打开函数*/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鼠标控制模块鼠标控制模块实现的是对鼠标的操作,包括鼠标状态的获取、鼠标位置的设置和绘制鼠标,着几个功能分别由函数 mouseStatus()、setMousePos()和 drawMouse()来实现。

    1) int mouseStatus(int* x, int* y), 获取鼠标的位置,包括水平位置和垂直位置,以及鼠标的按键情况(左键、右键和没有按键)2) int setMousePos(int x , int y), 设置鼠标的位置,将鼠标指针设置在(x,y)表示的坐标位置;(3) 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表示水平位置,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; /*入口参数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+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; 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; /*鼠标移动,没有单击,仅仅画移动的鼠标*/ 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) { /*从键盘获取键值,开始操作(移动、放大、缩小、旋转)直线*/ key=bioskey(0); /*ESC键,退出操作*/ if(key==ESC) break; /*旋转*/ if(key==SPACE) { /*计算旋转中心*/ /*如果直线示倾斜的*/ 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; /*旋转不能超过边界*/ if(lineStartx>=10 && lineStarty>=40 && lineEndx <=620 && lineEndy <=445) { /*清除原有的直线*/ setwritemode(XOR_PUT); line(lineStartx,lineStarty,lineEndx,lineEndy); /*计算旋转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; /*计算旋转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; /*绘制旋转后的直线*/ 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(lineStartxlineEndx) { lineEndx-=increment_x; lineEndy-=increment_y; lineStartx+=increment_x; lineStarty+=increment_y; } 。

    点击阅读更多内容
    最新文档
    2025年作风建设学习教育开展情况的报告范文.docx
    在2025年民营企业座谈会上的主持讲话范文.docx
    在2025年全县教育领域群众身边不正之风和腐败问题集中整治调度会上的讲话范文.docx
    工委副书记在2025年机关DeepSeek应用专题辅导培训班开班仪式上的讲话范文.docx
    在2025年DeepSeek大模型政务应用培训会上的讲话范文.docx
    在青年干部培训结业典礼上的讲话文稿.docx
    2025年副书记防汛工作会议上的讲话范文.docx
    2025年主管商务部门党组书记在理论学习中心组会上研讨发言文稿.docx
    2025年国企党委关于干部职工思想政治工作情况的报告范文.docx
    在机关单位作风建设学习教育突出问题专项整治工作部署会议上的讲话范文.docx
    医院领导2025年党风廉政建设推进会上的讲话范文.docx
    2025年关于开展“以案促改”工作实施方案供参考.docx
    在2025年安全生产专项整治暨化工行业风险防控部署会上的讲话范文.docx
    领导干部在“十五五”发展规划编制启动会上的讲话文稿.docx
    2025年书记在慰问老干部暨情况通报会上的主持讲话提纲范文.docx
    2025年作风建设实施方案文稿.docx
    在2025年DeepSeek政务应用培训会上的讲话范文.docx
    2025年领导在DeepSeek政务应用培训会上的讲话参考范文.docx
    2025年国企党委关于干部职工思想政治工作情况的报告文稿.docx
    在青年干部培养工作座谈会上的讲话范文.docx
    卖家[上传人]:仙人指路
    资质:实名认证
    相关文档
    正为您匹配相似的精品文档