C语言课程设计简单图形处理



《C语言课程设计简单图形处理》由会员分享,可在线阅读,更多相关《C语言课程设计简单图形处理(17页珍藏版)》请在装配图网上搜索。
1、 1. 课程设计总体要求 2 2. 设计任务与分析 2 2.1设计题目 2 2.2主要内容 2 2.3任务分析 2 3. 设计方案 2 3.1模块 2 3.2流程图 3 3.3主要函数 3 3.4负责的模块设计 3 4. 程序调试 6 5. 总结与心得 12 6. 参考文献 13 1. 课程设计总体要求 采用模块儿化程序设计; 鼓励可视化编程; 源程序中有足够的注释; 学生可自行增加新功能模块儿; 必须上机调试通过; 注重算法运用,优化存储效率与运
2、算效率; 需提交源程序及相关文件; 2. 设计任务与分析 2.1设计题目 简单图形处理 2.2主要内容 只考虑点、直线、圆三种基本图形。对于点,给出点的横纵坐标;对于直线,给出直线方程ax+by+c=0的三个系数a,b,c;对于圆,给出圆心坐标和半径。试说明图形的几何形状类型,并编写输入和输出图形数据、求两点矩离、求两直线交点、已知点和半径形成圆、已知两点形成直线等函数。 2.3任务分析 这个系统主要需要实现对求两点矩离、求两直线交点、已知点和半径形成圆、已知两点形成直线。我们可以先构建一个主函数,然后一次插入不同的功能函数。在实现功能函数的过程
3、中又通过菜单函数进行各功能函数的调用。在运用图形处理函数的时候要用到图形文件。 3. 设计方案 3.1模块 (1)输入两点,求出之间的距离。 (2)输入圆心和半径输出一般的圆。 (3)输入两直线表达式X,Y的系数,求出两直线的交点。 (4)输入两点,输出通过该两点的直线。 (5)退出。 3.2流程图 进入选择菜单 输入数字0~4 0 退出系统 开始 1~两点之间的距离 退出系统 4~ 形成直线 2~两直线的交点 退出系统 3~ 形成圆 3.3主要函数 1.pointjl() (求两点之间的距离) 2.lin
4、ejd();(求两直线的交点) 3.yuan();(已知圆心和半径形成圆) 4.line1();(已知两点形成直线) 5.choice();(功能选择) 3.4负责的模块设计 我所负责的模块: (1) 输入两直线表达式X,Y的系数,求出两直线的交点。 void linejd()/*求两直线交点*/ { float a1,a2,b1,b2,c1,c2,x,y;/*请输入直线的系数*/ printf("***********************************************************************************
5、**************************\n"); printf("请输入直线1 a1x+b1y+c1=0 的系数 a1,b1,c1 和直线2 a2x+b2y+c2=0 的系数 a2,b2,c1:\n"); printf("*************************************************************************************************************\n"); scanf("%f,%f,%f,%f,%f,%f",&a1,&b1,&c1,&a2,&b2,&c2); if(a
6、1*b2==b1*a2) { if(b1*c2==c1*b2) printf("两直线重合,有无数个交点。\n"); else printf("两直线平行,无交点。\n"); } else { x=(c2/b2-c1/b1)/(a1/b1-a2/b2); y=(c2/a2-c1/a1)/(b1/a1-b2/a2); printf("两直线交点是 x=%f,y=%f.\n",x,y); } getchar(); } (2) 输入两点,输出通过该两点的直线。 void line1() /*输出输入已知数据
7、的直线*/ { int x1,y1,x2,y2; int gdriver, gmode, i; printf("*********************************************************\n"); printf("请输入两点 ,x1,y1,x2,y2:\n"); printf("*********************************************************\n"); scanf("%d,%d,%d,%d",&x1,&y1,&x2,&y2); gdriver=DETECT; initgr
8、aph(&gdriver, &gmode, "c:\\caic\\bgi"); setbkcolor(BLUE);/*设定背景颜色为蓝色*/ cleardevice(); setcolor(GREEN); setlinestyle(0, 0, 3); setcolor(2); setcolor(WHITE); setlinestyle(4, 0xaaaa, 1); line(x1+320, y1+240, x2+320, y2+240); getch(); closegraph(); } (3) 选择函数的设计 int choice ()/*选
9、择函数的定义*/ { char c; int k=1; menu(); c=getchar(); while(k) switch(c) { case 1:pointjl() ;k=0;break; case 2:linejd() ;k=0;break; /*求已知两直线之间的交点函数*/ case 3:yuan();k=0;break; case 4:line1();k=0;break; case 0:k=0;break; } printf("******
10、***************************************************\n"); printf("欢迎使用该系统\n"); printf("*********************************************************\n"); return 1; } 4. 程序调试 下面是进入时出现的一个示例图片。通过查找资料并以此图来调试我们知道画面中心的坐标是(320,240),我们就在程序中每个输入的横坐标加上320,纵坐标加上240,以防输入坐标偏离中心太远导致显示不理想。同时该圆的半径是98,这样我们就对数字
11、代表的长度有了一个大概的了解。 下面是对输出直线功能的调试。 输入数据:0,0,200,200;显示出的图形如下图所示。我们可以看出,X轴正方向向左,Y轴正方向向下。为了进一步验证Y轴正方向向下,我做了第二次输入。 如下图,此次输入的数据为:0,0,0,-200;由此可以断定,Y轴的正方向向下。 接下来是对求两直线交点的调试。 由下图可以看出当输入数据为1,2,3,3,2,1时得出交点为(1,-2)。对于直线x+2y+3=0与直线3x+2y+1=0,我们直接将x=1,y=-2带入,发现均成立,于是所求交点是正确的,程序没有问题。 但是当我们输入两条重合或者平行直线时
12、,程序给出了以下结果: 可以发现给出的结果为1.#INF00的字样,这表示超出机器浮点类型所表示的范围。于是我认为程序还需改进。 改进后调试结果如下: 改进成功! 下面是对选择功能的调试。 输入1,结果如下: 没有问题。 输入2,结果如下: 没有问题。 输入3,结果如下: 没有问题。 输入4,结果如下: 没有问题。 至此,调试完毕! 5. 总结与心得 每一个简单的功能的实现实际上背后都有一个繁重的工程。尽管这是一个很简单的图形的输出、处理系统,但是每一个函数的设计、每一个功能的实现都来之不易。尤其是当每一个模块的程序编写好后的试运行
13、,一个个error的寻找、改正花费了数倍于编写的时间。尽管编写的过程漫长、枯燥,甚至痛苦,但是当最后程序成功运行时,兴奋的心情还是立刻充斥心间,最后的成功就是对前面付出的最好回报。 通过这次实践我也学到了很多。C语言的知识更加扎实、丰富,做事更加细心、耐心,还学会了如何与人合作来更快、更高效地完成任务。总之,这次实践中我收获了许多,希望以后可以继续与他人合作完成更多的任务! 6. 参考文献 [1] 谭浩强. C语言程序设计[M].北京:清华大学出版社.2006 [2] 张高煜. C语言程序设计实训.北京:中国水利出版社.2001 [3] 王晓东. C语言设计简明教程.北京:中国水
14、利出版社.2006
附:源代码:
#include
15、*******************\n"); printf("请输入直线1 a1x+b1y+c1=0 的系数 a1,b1,c1 和直线2 a2x+b2y+c2=0 的系数 a2,b2,c1:\n"); printf("*************************************************************************************************************\n"); scanf("%f,%f,%f,%f,%f,%f",&a1,&b1,&c1,&a2,&b2,&c2); if(a1*
16、b2==b1*a2) { if(b1*c2==c1*b2) printf("两直线重合,有无数个交点。\n"); else printf("两直线平行,无交点。\n"); } else { x=(c2/b2-c1/b1)/(a1/b1-a2/b2); y=(c2/a2-c1/a1)/(b1/a1-b2/a2); printf("两直线交点是 x=%f,y=%f.\n",x,y); } getchar(); } void pointjl() /*求两点之间的距离*/ { int x1,y1,x2,y2
17、; float jl; printf("*********************************************************\n"); printf("请输入两点,x1,y1,x2,y2:\n"); printf("*********************************************************\n"); scanf("%d,%d,%d,%d",&x1,&y1,&x2,&y2); jl=sqrt(pow(x1-x2,2)+pow(y1-y2,2)); printf("这是两点 x1=%d , y
18、1=%d 和 x2=%d , y2=%d 之间的距离是\n jl=%f\n",x1,y1,x2,y2,jl); getchar(); } void line1() /*输出输入已知数据的直线*/ { int x1,y1,x2,y2; int gdriver, gmode, i; printf("*********************************************************\n"); printf("请输入两点 ,x1,y1,x2,y2:\n"); printf("*****************************
19、****************************\n"); scanf("%d,%d,%d,%d",&x1,&y1,&x2,&y2); gdriver=DETECT; initgraph(&gdriver, &gmode, "c:\\caic\\bgi"); setbkcolor(BLUE);/*设定背景颜色为蓝色*/ cleardevice(); setcolor(GREEN); setlinestyle(0, 0, 3); setcolor(2); setcolor(WHITE); setlinestyle(4, 0xaaaa, 1);
20、line(x1+320, y1+240, x2+320, y2+240); getch(); closegraph(); } void yuan() /*输出输入了已知数据的圆*/ { int x1,y1,r; int gdriver, gmode, i; printf("*********************************************************\n"); printf("请输入圆心 x1,y1 圆的半径 r:\n"); printf("**************************************
21、*******************\n"); scanf("%d,%d,%d",&x1,&y1,&r); gdriver=DETECT; initgraph(&gdriver, &gmode, "c:\\caic\\bgi"); setbkcolor(BLUE); cleardevice(); setcolor(GREEN); circle(x1+320, y1+240, r); setlinestyle(0, 0, 3); setcolor(2); setcolor(WHITE); setlinestyle(4, 0xaaaa, 1); g
22、etch(); closegraph(); } void menu() /*菜单函数*/ { printf("*********************************************************\n"); printf("欢迎进入简单的图形处理系统!\n"); printf("*********************************************************\n"); printf("*********************************************************\n");
23、 printf("请输入 1,2,3,4:\n");/*请输入数字1,2,3,4*/ printf("1.两点之间的距离\n");/*两点之间的距离*/ printf("2.两直线的交点 \n");/*两直线的交点*/ printf("3.已知点和半径形成圆\n");/*已知点和半径形成圆*/ printf("4.已知两点形成直线 \n");/*已知两点形成直线*/ printf("*********************************************************\n"); } int choice ()/*选择函
24、数的定义*/ { char c; int k=1; menu(); c=getchar(); while(k) switch(c) { case 1:pointjl() ;k=0;break; case 2:linejd() ;k=0;break; /*求已知两直线之间的交点函数*/ case 3:yuan();k=0;break; case 4:line1();k=0;break; case 0:k=0;break; } printf("********
25、*************************************************\n"); printf("欢迎使用该系统\n"); printf("*********************************************************\n"); return 1; } int main() { int gdriver, gmode, i;/*在进入主菜单之前先形成一个已知图形*/ gdriver=DETECT; initgraph(&gdriver, &gmode, "c:\\caic\\bgi"); setbk
26、color(BLUE); cleardevice(); setcolor(GREEN); circle(320, 240, 98); setlinestyle(0, 0, 3); setcolor(2); rectangle(220, 140, 420, 340); setcolor(WHITE); setlinestyle(4, 0xaaaa, 1); line(220, 240, 420, 240); line(320, 140, 320, 340); getch(); closegraph(); choice(); getchar(); return 1; } 16
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。