为啥同一组数据出来的图形不一样呢 大家帮忙看看
我想把txt里的数据输出形成图像,显示在Form上。其中txt文件里的数据格式,每一行为一组数据,分别表示时间和长度。例如,(0,1)0代表时间,1代表长度,把每一组数据画成图像显示到FORM上。关于绘图我找了一个类,程序写完后觉得没什么问题,运行成功,但是这时出现另外一个问题,当相同的数据我如果读取两次的话,前后两次显示的图像是不一样的,我把全部代码贴出来,大家帮忙看一下。
void CProjectTestDlg::OnBUTTONReadDate() //按钮函数,读取txt文件中的数据,形成曲线,画在FORM上
{
// TODO: Add your control notification handler code here
m_wndScope.Clear();//清除数据,代码在最下面 m_wndScope 是一个显示曲线的控件的变量
CStdioFile file;
CString strPath,readstring;//文件路径,每行数据
CString strtime,strlength;
float strTime, strLength;
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"ALL Files(*.txt)|*.txt||",AfxGetMainWnd());
if (dlg.DoModal()==IDOK)
{
strPath=dlg.GetPathName();
file.Open(strPath, CFile::modeRead);
while(file.ReadString(readstring))//读取txt中每一行的数据
{
int pos=readstring.Find(",");
strtime=readstring.Left(pos);//逗号前面为时间,也就是横坐标
strTime=atof(strtime.GetBuffer(10));
strtime.ReleaseBuffer();
strlength=readstring.Right(readstring.GetLength()-pos-1);//后面为长度,也就是纵坐标
strLength=atof(strlength.GetBuffer(10));
strlength.ReleaseBuffer();
m_wndScope.AddValue(strTime,strLength,FALSE);//这里为画图的函数,代码在下面
m_wndScope.UpdateCurve(); //这里为更新曲线的函数,代码在下面
}
file.Close();
}
}
int SensorNum=0;
int SNSort=0;
float SaveDataX[4096];
float SaveDataY[4096];
std::list<double> m_TimeList[5];
std::list<double> m_ValueList[5];
BOOL CScope::AddValue(double dTime,double dValue,BOOL FSaveData)//采用的是先将数据写入内存中,然后从内存中绘图
{
int i=0;
if(m_bDrawing)
return FALSE;
m_TimeList[4].push_back(dTime);//保存所有数据
m_ValueList[4].push_back(dValue);//保存所有数据
m_TimeList[SNSort].push_back(dTime);
m_ValueList[SNSort].push_back(dValue);
std::list<double>::iterator start_it[4];
start_it[SNSort] = m_TimeList[SNSort].begin();
std::list<double>::iterator end_it[4];
end_it[SNSort] = m_TimeList[SNSort].end();
end_it[SNSort]--;
double dStartTime[4];
dStartTime[SNSort]=*(start_it[SNSort]);
double dEndTime[4];
dEndTime[SNSort]=*(end_it[SNSort]);
SNSort++;SNSort%=4;
while(dEndTime[0]-dStartTime[0]>4*m_dDimT)
{
for(i=0;i<4;i++)//4
{
m_TimeList[i].pop_front();
m_ValueList[i].pop_front();
start_it[i]=m_TimeList[i].begin();
end_it[i]=m_TimeList[i].end();
end_it[i]--;
dStartTime[i]=*(start_it[i]);
dEndTime[i]=*(end_it[i]);
}
}
if (FSaveData==TRUE)
{
ofstream os;
os.open("MagCurve.txt",ios::trunc/*app*/,filebuf::openprot );
unsigned int nSize_temp=0;
nSize_temp= m_TimeList[4].size();
int j;
std::list<double>::iterator time_it;
time_it= m_TimeList[4].begin();
std::list<double>::iterator value_it;
value_it= m_ValueList[4].begin();
std::list<double>::iterator time_begin;
time_begin=time_it;
for(j=0;j<nSize_temp;j++)
{
SaveDataX[j] = *time_it-*time_begin;
SaveDataY[j] = *value_it;
time_it++;
value_it++;
os<<SaveDataX[j]<<','<<SaveDataY[j]<<endl; //保存为TXT文本
os.close();
FSaveData=FALSE;
return FSaveData;
}
else return FALSE;
}
void CScope::UpdateCurve()//更新曲线
{
CClientDC dc(this);
CRect rect;
GetClientRect(&rect);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap bitmap,*pOldBmp;
bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
pOldBmp = memDC.SelectObject(&bitmap);
DrawGrid(&memDC);//重回坐标轴里的网格线
DrawCurve(&memDC,0);//重绘曲线
dc.BitBlt(m_rectCurve.left,m_rectCurve.top,m_rectCurve.Width(),m_rectCurve.Height(),&memDC,m_rectCurve.left,m_rectCurve.top,SRCCOPY);
memDC.SelectObject(pOldBmp);
}
void CScope::DrawCurve(CDC *pDC,int SensorNum)//绘制曲线
{
m_bDrawing = TRUE;
unsigned int nSize[4];
nSize[SensorNum]= m_TimeList[SensorNum].size();
POINT *pPointArray=(POINT *) new POINT[nSize[SensorNum]];
int i;
std::list<double>::iterator time_it[4];
time_it[SensorNum]= m_TimeList[SensorNum].begin();
std::list<double>::iterator value_it[4];
value_it[SensorNum]= m_ValueList[SensorNum].begin();
std::list<double>::iterator time_begin[4];
time_begin[SensorNum] = time_it[SensorNum];
for(i=0;i<nSize[SensorNum];i++)
{
pPointArray[i].x = ConvertTimeToAxisX(*time_it[SensorNum]-*time_begin[SensorNum]);
pPointArray[i].y = ConvertValueToAxisY(*value_it[SensorNum]);
time_it[SensorNum]++;
value_it[SensorNum]++;
}
m_bDrawing =FALSE;
pDC->SelectClipRgn(&m_rgnCurve);
CPen *pOldPen1;
switch (SensorNum)
{
case 0:
pOldPen1 = pDC->SelectObject(&m_PenCurve1);
break;
case 1:
pOldPen1 = pDC->SelectObject(&m_PenCurve2);
break;
case 2:
pOldPen1 = pDC->SelectObject(&m_PenCurve3);
break;
case 3:
pOldPen1 = pDC->SelectObject(&m_PenCurve4);
break;
}
pDC->Polyline(pPointArray,nSize[SensorNum]);
pDC->SelectClipRgn(NULL);
pDC->SelectObject(pOldPen1);
delete []pPointArray;
}
void CScope::Clear()//清除数据
{
int i=0;
for (i=0;i<5;i++)
{
m_TimeList[i].clear();
m_ValueList[i].clear();
}
memset(SaveDataX,0,4096);
memset(SaveDataY,0,4096);
UpdateCurve();
}
代码有点长,麻烦大家耐心给看一下,琢磨好长时间了一直没结果,先谢谢各位高手了。
再把问题重复一遍,我连续两次读同一txt文件,出来的曲线为什么均不一样呢,我怀疑是每次读txt的时候,有些变量或者内存中有数据没有清空,大家看看是哪里的问题