> 文档中心 > VC6.0 MFC 加速度、速度、位移运动分析

VC6.0 MFC 加速度、速度、位移运动分析


加速度、速度、位移运动分析

一、 前期准备

1、首先新建一个记事本,在里面写上一些数据(加速度),这里我们仅列举了13组数据。添加好这些数据后,将它放在接下来你要新建的工程文件夹下,我这里是放在G盘的根目录下(G:\JiaSuDu.txt),如下图所示
在这里插入图片描述
2、紧接着我们新建一个MFC单文档应用程序,如下图所示。

准备工作完毕!
在这里插入图片描述
在这里插入图片描述
二、过程分析

1、首先,我们新建一个类,如下图所示。
在这里插入图片描述
在这里插入图片描述
2、添加成员变量,如下图所示。(CDC *pDC记得别忘了!)
在这里插入图片描述
3、添加读文件函数,将刚刚新建的记事本内容(加速度)给读出来,如下图所示。
在这里插入图片描述
代码如下:

void CJiaSuDuFenXi::ReadJiaSuDu(){int i;FILE *fp; //定义一个文件fp = fopen("G:\\JiaSuDu.txt","r"); //打开文件for (i = 0;i < 13;i++)  //我们输入的是13组数据,所以小于13(数组下标从0开始){fscanf(fp,"%f %f %f",&ax[i],&ay[i],&az[i]);}fclose(fp); //记得要关闭文件}

4、我们可以先画个草图简单地分析下,如下图所示。
在这里插入图片描述
5、在画之前,我们先要把速度、位移给求出来,于是添加一个“QiuSuDuWeiYi”的成员函数,如下图所示。
在这里插入图片描述
代码如下:

void CJiaSuDuFenXi::QiuSuDuWeiYi(){int i;float DeltaT = 0.1;vx[0] = 0;vy[0] = 0;vz[0] = 0;for (i = 1;i < 13;i++){vx[i] = vx[i - 1] + (ax[i - 1] + ax[i])/2 * DeltaT; //梯形法vy[i] = vy[i - 1] + (ay[i - 1] + ay[i])/2 * DeltaT;vz[i] = vz[i - 1] + (az[i - 1] + az[i])/2 * DeltaT;}sx[0] = 0;sy[0] = 0;sz[0] = 0;for (i = 1;i < 13;i++){sx[i] = sx[i - 1] + (vx[i - 1] + vx[i])/2 * DeltaT; //梯形法sy[i] = sy[i - 1] + (vy[i - 1] + vy[i])/2 * DeltaT;sz[i] = sz[i - 1] + (vz[i - 1] + vz[i])/2 * DeltaT;}}

6、读完文件后,我们就来开始画。为了更好的模块化,我们可以分别添加DrawJiaSuDu()、DrawSuDu()、DrawWeiYi()这样三个成员函数,到时候可以直接在Draw(CDC *p)中调用,如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
7、分别在上面的三个成员函数里添加代码,如下。
(1)加速度

void CJiaSuDuFenXi::DrawJiaSuDu(){int i,x,y;int kdbl = 10,gdbl = 30; //宽度比例,高度比例int ydx = 30,ydy = 400; //原点x,原点y(巧妙用变量)DrawCordinate(pDC, CPoint(ydx,ydy));//==============画ax====================x = ydx; //横轴是时间y = ydy - ax[0] * gdbl; //纵轴才是ax,ay,azpDC->MoveTo(x,y);for (i = 1;i < 13;i++) {x += kdbl; //横轴的时间(0.1秒),我们把它转化为像素。如果间隔是10,那么13组也就是130y = ydy - ax[i] * gdbl; //竖直向下为正,所以“-”。我们在记事本中写的加速度值很小(1,2,3,…)//如果按像素算,显示得太小,所以我们给它放大一点(这里我放大了30倍)pDC->LineTo(x,y);}//==============画ay====================x = ydx;y = ydy - ay[0] * gdbl;pDC->MoveTo(x,y);for (i = 1;i < 13;i++){x += kdbl;y = ydy - ay[i] * gdbl;pDC->LineTo(x,y);}//==============画az====================x = ydx;y = ydy - az[0] * gdbl;pDC->MoveTo(x,y);for (i = 1;i < 13;i++){x += kdbl;y = ydy - az[i] * gdbl;pDC->LineTo(x,y);}}

(2)速度

void CJiaSuDuFenXi::DrawSuDu(){int i,x,y;int kdbl = 10,gdbl = 30; //宽度比例,高度比例int ydx = 30,ydy = 400; //原点x,原点yydx = 400;DrawCordinate(pDC, CPoint(ydx,ydy));//==============画vx====================x = ydx;y = ydy - vx[0] * gdbl;pDC->MoveTo(x,y);for ( i = 1;i < 13;i++){x += kdbl;y = ydy - vx[i] * gdbl;pDC->LineTo(x,y);}//==============画vy====================x = ydx;y = ydy - vy[0] * gdbl;pDC->MoveTo(x,y);for ( i = 1;i < 13;i++){x += kdbl;y = ydy - vy[i] * gdbl;pDC->LineTo(x,y);}//==============画vz====================x = ydx;y = ydy - vz[0] * gdbl;pDC->MoveTo(x,y);for ( i = 1;i < 13;i++){x += kdbl;y = ydy - vz[i] * gdbl;pDC->LineTo(x,y);}}

(3)位移

void CJiaSuDuFenXi::DrawWeiYi(){int i,x,y;int kdbl = 10,gdbl = 30; //宽度比例,高度比例int ydx = 600,ydy = 400; //原点x,原点yydx = 800;DrawCordinate(pDC, CPoint(ydx,ydy));//==============画sx====================x = ydx;y = ydy - sx[0] * gdbl;pDC->MoveTo(x,y);for (i = 1;i < 13;i++){x += kdbl;y = ydy - sx[i] * gdbl;pDC->LineTo(x,y);}//==============画sy====================x = ydx;y = ydy - sy[0] * gdbl;pDC->MoveTo(x,y);for ( i = 1;i < 13;i++){x += kdbl;y = ydy - sy[i] * gdbl;pDC->LineTo(x,y);}//==============画sz====================x = ydx;y = ydy - sz[0] * gdbl;pDC->MoveTo(x,y);for ( i = 1;i < 13;i++){x += kdbl;y = ydy - sz[i] * gdbl;pDC->LineTo(x,y);}}

8、为了在视觉上看起来更逼真,还可以添加坐标轴,如下图所示。
在这里插入图片描述
代码如下:

void CJiaSuDuFenXi::DrawCordinate(CDC *pDC, CPoint orgPos){pDC->MoveTo( orgPos.x-50,orgPos.y );pDC->LineTo( orgPos.x+200,orgPos.y );pDC->MoveTo( orgPos.x,orgPos.y-300 );pDC->LineTo( orgPos.x,orgPos.y+150 );}

9、现在我们就可以新建一个Draw(CDC *p),将上面完成的模块代码调用,如下图所示。
在这里插入图片描述
代码如下:

void CJiaSuDuFenXi::Draw(CDC *p){pDC = p;ReadJiaSuDu(); //读出加速度QiuSuDuWeiYi(); //求速度、位移DrawJiaSuDu(); //画加速度曲线DrawSuDu(); //画速度曲线DrawWeiYi(); //画位移曲线}

10、最后别忘了嵌入头文件,如下图所示。
在这里插入图片描述
11、此时编译运行发现界面上并不能显示画面,其原因是我们还没有在CChapter_0708View里定义,如下图所示。
在这里插入图片描述

在这里插入图片描述
三、运行结果
在这里插入图片描述

历史新知