| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 322 人关注过本帖
标题:为啥同一组数据出来的图形不一样呢 大家帮忙看看
只看楼主 加入收藏
thshanshi
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-7-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
为啥同一组数据出来的图形不一样呢 大家帮忙看看
我想把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的时候,有些变量或者内存中有数据没有清空,大家看看是哪里的问题
搜索更多相关主题的帖子: 图形 control 
2011-07-29 16:28
calm_hard
Rank: 2
等 级:论坛游民
帖 子:3
专家分:22
注 册:2011-5-26
收藏
得分:20 
设置断点慢慢调试,看看数据在哪开始不一样的,在哪出现的错误。
2011-07-31 13:39
快速回复:为啥同一组数据出来的图形不一样呢 大家帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016285 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved