C语言实现动画小车模拟焊药自动配料系统Word文档下载推荐.docx
《C语言实现动画小车模拟焊药自动配料系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C语言实现动画小车模拟焊药自动配料系统Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
1)操作员通过计算机键盘设定一种焊药的配方(即需用到要哪几种化学原料,每种化学原料的重量)。
假设一种焊药配方最多只需要6种化学原料,分别是A,B,C,D,E,F,并假设A,B,C,D,E,F这6种化学原料分别存放在1,2,3,4,5,6这6只料斗里面。
因此还要设定好要用到的每种化学原料分别装在那只料斗里面。
下面我们假设某种焊药的配方用到4种化学原料A,C,D和E。
A,C,D和E这4种化学原料分别装在1,3,4,5这4只料斗里面,而且A,C,D和E这4种化学原料的重量比例是5公斤,10公斤,20公斤和65公斤(假设小车最多能装100公斤化学原料)。
设定好后,操作员发布“开始配料”命令。
2)首先将小车退回到达0号位置开关,准备开始一次配料。
即当小车到达0号位置
开关时,小车停止。
3)启动小车向前行驶,当小车到达1号位置开关时,小车停止,1号料斗打开,开始
向小车里面流入化学原料A,当达到5公斤时,1号料斗关闭,停止流料。
启动小
车向前行驶。
4)当小车2号位置开关时,因为不需要配2号料斗里面的化学原料B,故小车不停
止,继续向前行驶。
5)当小车3号位置开关时,小车停止,3号料斗打开,开始向小车里面流入化学原料
C,当达到10公斤时,3号料斗关闭,停止流料。
启动小车向前行驶。
6)当小车4号位置开关时,小车停止,4号料斗打开,开始向小车里面流入化学原料
D,当达到20公斤时,4号料斗关闭,停止流料。
7)当小车5号位置开关时,小车停止,5号料斗打开,开始向小车里面流入化学原料
E,当达到65公斤时,5号料斗关闭,停止流料。
8)当小车6号位置开关时,因为不需要配6号料斗里面的化学原料F,故小车不停
9)当小车到达7号位置开关时,小车停止,并将车厢自动翻起来,将车厢里的化学
原料倒入搅拌机,然后小车快速倒退行驶。
小车倒退行驶过程中,遇到6,5,4,
3,2,1号位置开关都不停止行驶,直到小车遇到0号位置开关才停止行驶。
10)循环执行第3步到第9步,直到操作员发布“停止配料”命令,配料过程结束。
操作员只有在小车到达0号和7号位置开关时,才能发布“停止配料”命令。
用C语言或者C++语言编写一个程序,用形象化的动画动作模拟上述焊药自动配料系
统的工作过程。
图1-4中料斗、开关和小车的形状仅是示意图,你可以根据自己的想象设计
更加美观、逼真的形象。
1.3设计指标或者要求
1)假设小车匀速向前行驶,小车匀速倒退行驶,且倒退速度明显快于前进速度。
其目
的是提高生产效率。
2)配料重量可以用小车在料斗前停顿的时间长度来模拟。
例如每公斤料对应小车停顿
0.2秒。
(希望每公斤料对应小车的停顿时间应该可以调整)。
3)所有的化学原料都是面粉状的固体原料。
2设计过程
2.1程序功能
用C语言编写程序,制作动画模拟上述焊药自动配料系统的工作过程。
2.2算法原理
小车行驶:
小车在屏幕上行驶采用的方法是在原地画出该图形在此刻将其擦去,并在下一时刻在其将要行驶到的位置将其再次画出,利用视觉暂留现象实现小车的行驶。
配料下落:
配料下落的过程,首先生成随机数,进而生成随机点的坐标,再利用函数关系将随机点根据料筒的位置固定在不同的区域,在小车到来停下时生成下落的配料。
生成配料的同时将随机生成的点的坐标存入数组,待配料下落的粉末在屏幕上生成完全,再很快将其擦除,以此达到配料的下落的消失过程。
2.3程序流程图
N
Y
N
2.4程序主要模块或者函数
intshow_the_car(intright_x)//生成小车
{
//intthree_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132};
//fillpoly(3,three_corner);
setcolor(BLACK);
rectangle(right_x-50,260,right_x,285);
setlinestyle(0,NULL,2);
circle(right_x-36,292,6);
circle(right_x-14,292,6);
return0;
}
intcut_the_car(intright_x)//擦除小车
setcolor(LIGHTWHITE);
setfillstyle(LIGHTWHITE,SOLID_FILL);
//bar(right_x-50,258,right_x,286);
intmove_car(intbegin_tail,intend_tail)//移动小车
//show_the_car(begin_tail+27);
intdistance=begin_tail-end_tail;
intsmall_distance=distance/3;
intbig_distance=distance-small_distance;
//快走
for(inti_1=0;
i_1<
big_distance;
i_1++)
cut_the_car(begin_tail+27-i_1);
//Sleep
(1);
show_the_car(begin_tail+26-i_1);
Sleep(5);
//慢走
for(inti_2=0;
i_2<
small_distance;
i_2++)
cut_the_car(begin_tail+27-big_distance-i_2);
//Sleep(5);
show_the_car(begin_tail+26-big_distance-i_2);
Sleep(20);
//move_counter=0;
3软件运行或者测试结果
进入界面时会弹出对话框,要求用户输入配料的重量。
当用户将配料重量全部输入时,配料开始,小车将开始行驶。
小车行驶过程中,如果需要配料,将会在对应的料筒下停住,等待下料后会继续行驶。
小车最后将接到的配料倒入搅拌机。
4软件设计过程中遇到的问题以及解决办法
问题一:
小车行走过程中出现多余线条
小车的显示调用出现小车的函数show_the_car(),行走的时候同时调用show_the_car()和cut_the_car(),由于设置的坐标的缘故,小车开始出现的初始位置和move()函数开始发挥作用的位置不一致,造成开始位置处由于小车移动产生多余线条。
在不修改初始坐标位置的基础上,在主函数中将开始出现的小车在开始位置强行覆盖擦除,再调用move()即可消除多余线条。
问题二:
配料下落随机点形成的粉末区域太死板
配料下落时,会先产生随机数生产坐标的X和Y坐标,在一开始的时候只是采用简单的生成区域限制导致生成的坐标形成了死板的矩形。
后来根据料筒所在的位置计算出X和Y的线性约束关系,把下落的形状调整成了梯形。
5总结
这次实习任务锻炼了我在DOS下使用C图形库绘图的能力,在具体实施的过程中遇到了很多问题,比如一开始的对点线绘制的控制,后来逐渐掌握一块图形的出现消失和运动。
当遇到问题的时候虽然不知道怎么处理,还是主动去搜索问题的解决办法。
绘制图形的过程有点繁琐,不过对图像实现的动态效果也是很有意思的一件事情。
原本想深入地探索一下C绘图,但由于时间和自身能力的原因,目前只是做到这个地步。
希望以后自己在程序上多多练习。
附录
#include<
stdio.h>
stdlib.h>
conio.h>
graphics.h>
math.h>
string.h>
#defineINTERCEPT=0
#definePI3.1415
intshow_three_corner(intthis_num)//绘制上面的三角形
intthree_corner[6]={this_num-9,120,this_num+14,120,this_num+2,132};
fillpoly(3,three_corner);
//翻转车厢
intturn_up_box()
//显示15.
line(97,285,145,272);
line(145,272,139,248);
line(139,248,91,261);
line(91,261,97,285);
Sleep(500);
//擦除15.
//显示30.
line(97,285,140,260);
line(140,260,128,238);
line(128,238,85,263);
line(85,263,97,285);
Sleep(2000);
intturn_down_box()
//擦除30.
//Sleep(500);
show_the_car(149);
//清除车厢
intclear_carbox()
rectangle(149-50,260,149,285);
//货物从漏斗中倒入小车
intway_drop_in_car(intloudou_num)
{
intseed=80;
srand(seed);
intx[500],y[500];
for(inti_3=0;
i_3<
500;
i_3++)
x[i_3]=rand()%30+loudou_num-15;
y[i_3]=rand()%120+138;
if((4*x[i_3]+y[i_3]-118)>
=4*loudou_num&
&
(4*x[i_3]-y[i_3]+118)<
=4*loudou_num)
putpixel(x[i_3],y[i_3],BLACK);
for(i_3=0;
i_3+=10)
Sleep
(1);
for(intj_3=0;
j_3<
10;
j_3++)
{
putpixel(x[i_3+j_3],y[i_3+j_3],LIGHTWHITE);
}
}
//货物最后倒入搅拌机
intfinal_drop()
intseed=78;
intrand_1=rand()%30+70;
x[i_3]=rand()%30+70;
y[i_3]=rand()%80+300;
if((8*x[i_3]+y[i_3])>
=940&
(8*x[i_3]-y[i_3])<
=420)
Sleep(10);
Sleep
(1);
for(intj_3=0;
putpixel(x[i_3+j_3],y[i_3+j_3],LIGHTWHITE);
setfillstyle(BROWN_2,SOLID_FILL);
//生成搅拌机
bar3d(30,390,100,440,30,1);
//倒车
intback_the_car()
//cut_the_car(149);
intdistance=575-122;
intsmall_distance=distance/4;
intbig_distance=distance-small_distance*2;
cut_the_car(122+27+i_1);
show_the_car(122+28+i_1);
Sleep(18);
cut_the_car(122+27+small_distance+i_2);
//Sleep
(2);
show_the_car(122+28+small_distance+i_2);
//继续慢走
cut_the_car(122+27+small_distance+big_distance+i_3);
show_the_car(122+28+small_distance+big_distance+i_3);
voidmain()
inti=0;
intcount=0;
intx,y,a;
intgraph_driver=DETECT;
intgraph_mode;
floats;
doublem;
charmy_range=0;
char*nr[]={"
1"
"
2"
3"
4"
5"
6"
7"
8"
9"
};
char*radian[]={"
"
0"
//intthreepoints[6]={100,100,50,200,150,200};
initgraph(&
graph_driver,&
graph_mode,"
"
);
setbkcolor(LIGHTWHITE);
setcolor(DARKBLEAK_1);
setlinestyle(0,NULL,3);
setfillstyle(DARKBLEAK_1,SOLID_FILL);
cleardevice();
/*clearthesceen,setoriginpointiscurrentpoint*/
line(100,300,600,300);
//me划线
//setcolor(BLUE);
bar(98,295,105,302);
bar(595,295,602,302);
//搅拌机
//line(50,20,50,400);
//原点在(50,300)
//outtextxy(499,292,"
>
//outtextxy(501,301,"
x"
//outtextxy(48,16,"
^"
//outtextxy(52,20,"
y"
//下部分图形显示
setfillstyle(LIGHTDARKGREEN,SOLID_FILL);
for(i=105;
i<
=600;
i=i+70){
line(i,300,i,300+10);
/*每个刻度之间是70个像素点*/
outtextxy(i-3,315,*(radian+count));
count++;
//上部分图形显示
count=1;
for(i=175;
=525;
setcolor(LIGHTDARKGREEN);
bar(i-10,105,i+15,100+20);
//fillpoly(3,threepoints);
show_three_corner(i);
//line(i,100,i,100+10);
outtextxy(i-3,85,*(radian+count));
show_the_car(600);
//出现在初始位置
Sleep(800);
//强行擦除
//rectangle(rig