C语言课程设计简单图形处理.docx
- 文档编号:9940663
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:20
- 大小:400.94KB
C语言课程设计简单图形处理.docx
《C语言课程设计简单图形处理.docx》由会员分享,可在线阅读,更多相关《C语言课程设计简单图形处理.docx(20页珍藏版)》请在冰点文库上搜索。
C语言课程设计简单图形处理
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.1设计题目
简单图形处理
2.2主要内容
只考虑点、直线、圆三种基本图形。
对于点,给出点的横纵坐标;对于直线,给出直线方程ax+by+c=0的三个系数a,b,c;对于圆,给出圆心坐标和半径。
试说明图形的几何形状类型,并编写输入和输出图形数据、求两点矩离、求两直线交点、已知点和半径形成圆、已知两点形成直线等函数。
2.3任务分析
这个系统主要需要实现对求两点矩离、求两直线交点、已知点和半径形成圆、已知两点形成直线。
我们可以先构建一个主函数,然后一次插入不同的功能函数。
在实现功能函数的过程中又通过菜单函数进行各功能函数的调用。
在运用图形处理函数的时候要用到图形文件。
3.设计方案
3.1模块
(1)输入两点,求出之间的距离。
(2)输入圆心和半径输出一般的圆。
(3)输入两直线表达式X,Y的系数,求出两直线的交点。
(4)输入两点,输出通过该两点的直线。
(5)退出。
3.2流程图
3.3主要函数
1.pointjl()(求两点之间的距离)
2.linejd();(求两直线的交点)
3.yuan();(已知圆心和半径形成圆)
4.line1();(已知两点形成直线)
5.choice();(功能选择)
3.4负责的模块设计
我所负责的模块:
(1)输入两直线表达式X,Y的系数,求出两直线的交点。
voidlinejd()/*求两直线交点*/
{
floata1,a2,b1,b2,c1,c2,x,y;/*请输入直线的系数*/
printf("*************************************************************************************************************\n");
printf("请输入直线1a1x+b1y+c1=0的系数a1,b1,c1和直线2a2x+b2y+c2=0的系数a2,b2,c1:
\n");
printf("*************************************************************************************************************\n");
scanf("%f,%f,%f,%f,%f,%f",&a1,&b1,&c1,&a2,&b2,&c2);
if(a1*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)输入两点,输出通过该两点的直线。
voidline1()/*输出输入已知数据的直线*/
{
intx1,y1,x2,y2;
intgdriver,gmode,i;
printf("*********************************************************\n");
printf("请输入两点,x1,y1,x2,y2:
\n");
printf("*********************************************************\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);
line(x1+320,y1+240,x2+320,y2+240);
getch();
closegraph();
}
(3)选择函数的设计
intchoice()/*选择函数的定义*/
{
charc;
intk=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("*********************************************************\n");
printf("欢迎使用该系统\n");
printf("*********************************************************\n");
return1;
}
4.程序调试
下面是进入时出现的一个示例图片。
通过查找资料并以此图来调试我们知道画面中心的坐标是(320,240),我们就在程序中每个输入的横坐标加上320,纵坐标加上240,以防输入坐标偏离中心太远导致显示不理想。
同时该圆的半径是98,这样我们就对数字代表的长度有了一个大概的了解。
下面是对输出直线功能的调试。
输入数据:
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带入,发现均成立,于是所求交点是正确的,程序没有问题。
但是当我们输入两条重合或者平行直线时,程序给出了以下结果:
可以发现给出的结果为1.#INF00的字样,这表示超出机器浮点类型所表示的范围。
于是我认为程序还需改进。
改进后调试结果如下:
改进成功!
下面是对选择功能的调试。
输入1,结果如下:
没有问题。
输入2,结果如下:
没有问题。
输入3,结果如下:
没有问题。
输入4,结果如下:
没有问题。
至此,调试完毕!
5.总结与心得
每一个简单的功能的实现实际上背后都有一个繁重的工程。
尽管这是一个很简单的图形的输出、处理系统,但是每一个函数的设计、每一个功能的实现都来之不易。
尤其是当每一个模块的程序编写好后的试运行,一个个error的寻找、改正花费了数倍于编写的时间。
尽管编写的过程漫长、枯燥,甚至痛苦,但是当最后程序成功运行时,兴奋的心情还是立刻充斥心间,最后的成功就是对前面付出的最好回报。
通过这次实践我也学到了很多。
C语言的知识更加扎实、丰富,做事更加细心、耐心,还学会了如何与人合作来更快、更高效地完成任务。
总之,这次实践中我收获了许多,希望以后可以继续与他人合作完成更多的任务!
6.参考文献
[1]谭浩强.C语言程序设计[M].北京:
清华大学出版社.2006
[2]张高煜.C语言程序设计实训.北京:
中国水利出版社.2001
[3]王晓东.C语言设计简明教程.北京:
中国水利出版社.2006
附:
源代码:
#include
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#include"conio.h"
voidlinejd()/*求两直线交点*/
{
floata1,a2,b1,b2,c1,c2,x,y;/*请输入直线的系数*/
printf("*************************************************************************************************************\n");
printf("请输入直线1a1x+b1y+c1=0的系数a1,b1,c1和直线2a2x+b2y+c2=0的系数a2,b2,c1:
\n");
printf("*************************************************************************************************************\n");
scanf("%f,%f,%f,%f,%f,%f",&a1,&b1,&c1,&a2,&b2,&c2);
if(a1*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();
}
voidpointjl()/*求两点之间的距离*/
{
intx1,y1,x2,y2;
floatjl;
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,y1=%d和x2=%d,y2=%d之间的距离是\njl=%f\n",x1,y1,x2,y2,jl);
getchar();
}
voidline1()/*输出输入已知数据的直线*/
{
intx1,y1,x2,y2;
intgdriver,gmode,i;
printf("*********************************************************\n");
printf("请输入两点,x1,y1,x2,y2:
\n");
printf("*********************************************************\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);
line(x1+320,y1+240,x2+320,y2+240);
getch();
closegraph();
}
voidyuan()/*输出输入了已知数据的圆*/
{
intx1,y1,r;
intgdriver,gmode,i;
printf("*********************************************************\n");
printf("请输入圆心x1,y1圆的半径r:
\n");
printf("*********************************************************\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);
getch();
closegraph();
}
voidmenu()/*菜单函数*/
{
printf("*********************************************************\n");
printf("欢迎进入简单的图形处理系统!
\n");
printf("*********************************************************\n");
printf("*********************************************************\n");
printf("请输入1,2,3,4:
\n");/*请输入数字1,2,3,4*/
printf("1.两点之间的距离\n");/*两点之间的距离*/
printf("2.两直线的交点\n");/*两直线的交点*/
printf("3.已知点和半径形成圆\n");/*已知点和半径形成圆*/
printf("4.已知两点形成直线\n");/*已知两点形成直线*/
printf("*********************************************************\n");
}
intchoice()/*选择函数的定义*/
{
charc;
intk=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("*********************************************************\n");
printf("欢迎使用该系统\n");
printf("*********************************************************\n");
return1;
}
intmain()
{
intgdriver,gmode,i;/*在进入主菜单之前先形成一个已知图形*/
gdriver=DETECT;
initgraph(&gdriver,&gmode,"c:
\\caic\\bgi");
setbkcolor(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();
return1;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言课程设计 简单图形处理 语言 课程设计 简单 图形 处理