我在“TrendIdentification”控件后的代码如下:
void CQTAView::OnTrendidentification()
{
m_Plsy0=new double[data.m_AryLength/10];
m_xAve=new double[data.m_AryLength/10];
m_slope=new double[data.m_AryLength/10];
for(int m_start=0;m_start<100;m_start++)
{
data.PIs(data.m_pNumber,data.m_pDataAry,10*m_start,10*(m_start+1),m_Plsy0,m_xAve,m_slope); //将调用CData中的成员函数PIs
m_LSMCurve=TRUE;
Invalidate();
m_Plsy0+=1;
m_xAve+=1;
m_slope+=1;
}
}
CData中的成员函数PIs如下:
double CData::PIs(double xTime[],double yValue[],int m,int n,double* m_pLsy0,double* m_pXAve,double* m_pSlope)
{
//传入时间和变量值
//其中m为作最小二乘的起始点参数,n为作最小二乘的终点值参数
double sxx=0,sxy=0,syy=0; //初始化最小二乘的参数
double av_x=0,av_y=0,y0=0; //初始化最小二乘的参数
m_Plsstart=m,m_Plsend=n; //传入做最小二乘元素起始点,中止点
// double i_slope=0; //初始化直线的斜率
for(int i=m_Plsstart;i<m_Plsend;i++) //计算最小二乘估计均值参数
{
av_x+=xTime[i]/(m_Plsend-m_Plsstart); //计算时间均值
av_y+=yValue[i]/(m_Plsend-m_Plsstart); //计算变量的均值
}
for(int j=m_Plsstart;j<m_Plsend;j++) //计算最小二乘的参数
{
sxx+=(xTime[j]-av_x)*(xTime[j]-av_x); //计算的参数
sxy+=(xTime[j]-av_x)*(yValue[j]-av_y); //计算的参数
}
*m_pSlope=sxy/sxx; //计算拟合曲线的斜率
*m_pLsy0=av_y; //y均值
*m_pXAve=av_x; //x均值
//return m_slope; //返回曲线的斜率
return 0;
}//每十个数做一次最小二乘法拟合,得到的斜率、y均值、x均值分别存放在m_pSlope、m_pLsy0和 m_pXAve中,将用他们绘图如下:
CData::PaintLSM(CDC *pDC)
{
CPen aPen;
aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen=pDC->SelectObject(&aPen);
for(int j=m_Plsstart;j<m_Plsend;j++)
{
pDC->MoveTo(70+0.9*j,670-2*(*m_pLsy0+*m_pSlope*(j-*m_pXAve)));
pDC->LineTo(70+0.9*(j+1),670-2*(*m_pLsy0+*m_pSlope*((j+1)-*m_pXAve)));
}
pDC->SelectObject(pOldPen);
}更新程序放在OnDraw里了,如下:
void CQTAView::OnDraw(CDC* pDC)
{
if(m_LSMCurve)
{
data.m_Plsstart=10*m_start;
data.m_Plsend=10*(m_start+1);
data.m_pLsy0 = m_Plsy0;
data.m_pXAve = m_xAve;
data.m_pSlope=m_slope;
data.PaintLSM(pDC);
}
}
但现在的问题是图出不来了,如果我只调用一次data.PIs,可以出来10个数的拟合曲线,但是现在有一个循环,可能什么指针没有传递正确还是怎么的,图不显示了。
请问如何修改?
void CQTAView::OnTrendidentification()
{
m_Plsy0=new double[data.m_AryLength/10];
m_xAve=new double[data.m_AryLength/10];
m_slope=new double[data.m_AryLength/10];
for(int m_start=0;m_start<100;m_start++)
{
data.PIs(data.m_pNumber,data.m_pDataAry,10*m_start,10*(m_start+1),m_Plsy0,m_xAve,m_slope); //将调用CData中的成员函数PIs
m_LSMCurve=TRUE;
Invalidate();
m_Plsy0+=1;
m_xAve+=1;
m_slope+=1;
}
}
CData中的成员函数PIs如下:
double CData::PIs(double xTime[],double yValue[],int m,int n,double* m_pLsy0,double* m_pXAve,double* m_pSlope)
{
//传入时间和变量值
//其中m为作最小二乘的起始点参数,n为作最小二乘的终点值参数
double sxx=0,sxy=0,syy=0; //初始化最小二乘的参数
double av_x=0,av_y=0,y0=0; //初始化最小二乘的参数
m_Plsstart=m,m_Plsend=n; //传入做最小二乘元素起始点,中止点
// double i_slope=0; //初始化直线的斜率
for(int i=m_Plsstart;i<m_Plsend;i++) //计算最小二乘估计均值参数
{
av_x+=xTime[i]/(m_Plsend-m_Plsstart); //计算时间均值
av_y+=yValue[i]/(m_Plsend-m_Plsstart); //计算变量的均值
}
for(int j=m_Plsstart;j<m_Plsend;j++) //计算最小二乘的参数
{
sxx+=(xTime[j]-av_x)*(xTime[j]-av_x); //计算的参数
sxy+=(xTime[j]-av_x)*(yValue[j]-av_y); //计算的参数
}
*m_pSlope=sxy/sxx; //计算拟合曲线的斜率
*m_pLsy0=av_y; //y均值
*m_pXAve=av_x; //x均值
//return m_slope; //返回曲线的斜率
return 0;
}//每十个数做一次最小二乘法拟合,得到的斜率、y均值、x均值分别存放在m_pSlope、m_pLsy0和 m_pXAve中,将用他们绘图如下:
CData::PaintLSM(CDC *pDC)
{
CPen aPen;
aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen=pDC->SelectObject(&aPen);
for(int j=m_Plsstart;j<m_Plsend;j++)
{
pDC->MoveTo(70+0.9*j,670-2*(*m_pLsy0+*m_pSlope*(j-*m_pXAve)));
pDC->LineTo(70+0.9*(j+1),670-2*(*m_pLsy0+*m_pSlope*((j+1)-*m_pXAve)));
}
pDC->SelectObject(pOldPen);
}更新程序放在OnDraw里了,如下:
void CQTAView::OnDraw(CDC* pDC)
{
if(m_LSMCurve)
{
data.m_Plsstart=10*m_start;
data.m_Plsend=10*(m_start+1);
data.m_pLsy0 = m_Plsy0;
data.m_pXAve = m_xAve;
data.m_pSlope=m_slope;
data.PaintLSM(pDC);
}
}
但现在的问题是图出不来了,如果我只调用一次data.PIs,可以出来10个数的拟合曲线,但是现在有一个循环,可能什么指针没有传递正确还是怎么的,图不显示了。
请问如何修改?
解决方案 »
- mfc如何使右键菜单中的某一项变灰
- 有一点C++基础,没有MFC基础,想学点MFC基础编程,有什么好书?
- 如何用SDK来自绘按钮?
- 求加入开源合作团队
- 新手,关于OpenProcess的问题
- 在线等!在MDI应用程序中,如何去掉子窗口的最大化,最小化,关闭按钮?
- postmessage传了数据,但对方却收不到任何东东呢
- 高分求教!!如何在richedit里实现排版功能!!
- 菜鸟问题!!急
- 这难道不是一样的效果吗?
- 全屏截取图像,为什么显示的时候倒过来了
- 给位大牛,问一个关于MFC中SetTimer的问题,用settimer,一定时间后不能调用ontimer,而是调用析构函数,使对话框消失,这是怎么回事呀?很郁闷,调试了一晚上,也没有解决。。。。
{
m_Plsy0=new double[data.m_AryLength/10];
m_xAve=new double[data.m_AryLength/10];
m_slope=new double[data.m_AryLength/10];
for(int m_start=0;m_start <100;m_start++)
{
data.PIs(data.m_pNumber,data.m_pDataAry,10*m_start,10*(m_start+1),m_Plsy0,m_xAve,m_slope); //将调用CData中的成员函数PIs
m_LSMCurve=TRUE;
Invalidate();
m_Plsy0+=1;
m_xAve+=1;
m_slope+=1;
}
}
CData中的成员函数PIs如下:
double CData::PIs(double xTime[],double yValue[],int m,int n,double* m_pLsy0,double* m_pXAve,double* m_pSlope)
{
//传入时间和变量值
//其中m为作最小二乘的起始点参数,n为作最小二乘的终点值参数
double sxx=0,sxy=0,syy=0; //初始化最小二乘的参数
double av_x=0,av_y=0,y0=0; //初始化最小二乘的参数
m_Plsstart=m,m_Plsend=n; //传入做最小二乘元素起始点,中止点
// double i_slope=0; //初始化直线的斜率
for(int i=m_Plsstart;i <m_Plsend;i++) //计算最小二乘估计均值参数
{
av_x+=xTime[i]/(m_Plsend-m_Plsstart); //计算时间均值
av_y+=yValue[i]/(m_Plsend-m_Plsstart); //计算变量的均值
}
for(int j=m_Plsstart;j <m_Plsend;j++) //计算最小二乘的参数
{
sxx+=(xTime[j]-av_x)*(xTime[j]-av_x); //计算的参数
sxy+=(xTime[j]-av_x)*(yValue[j]-av_y); //计算的参数
}
*m_pSlope=sxy/sxx; //计算拟合曲线的斜率
*m_pLsy0=av_y; //y均值
*m_pXAve=av_x; //x均值
//return m_slope; //返回曲线的斜率
return 0;
}//每十个数做一次最小二乘法拟合,得到的斜率、y均值、x均值分别存放在m_pSlope、m_pLsy0和 m_pXAve中,将用他们绘图如下:
CData::PaintLSM(CDC *pDC)
{
CPen aPen;
aPen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen* pOldPen=pDC->SelectObject(&aPen);
for(int j=m_Plsstart;j <m_Plsend;j++)
{
pDC->MoveTo(70+0.9*j,670-2*(*m_pLsy0+*m_pSlope*(j-*m_pXAve)));
pDC->LineTo(70+0.9*(j+1),670-2*(*m_pLsy0+*m_pSlope*((j+1)-*m_pXAve)));
}
aPen.DeleteObject();//每次应该释放资源。***********
pDC->SelectObject(pOldPen);
} 更新程序放在OnDraw里了,如下:
void CQTAView::OnDraw(CDC* pDC)
{
if(m_LSMCurve)
{
data.m_Plsstart=10*m_start;
data.m_Plsend=10*(m_start+1);
data.m_pLsy0 = m_Plsy0;
data.m_pXAve = m_xAve;
data.m_pSlope=m_slope;
data.PaintLSM(pDC);
}
}
把for循环里头的下面两行拿到循环外面
m_LSMCurve=TRUE;
Invalidate();
然后调用一次重绘。在onDraw中根据生成的信息绘制就行了
我总觉得我的代码中缺了点什么,但又不会怎么改,可以具体指点一下吗?