我在“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个数的拟合曲线,但是现在有一个循环,可能什么指针没有传递正确还是怎么的,图不显示了。
请问如何修改?

解决方案 »

  1.   

    帮你整理下代码,顺便说,楼主记得释放资源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))); 

    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); 


      

  2.   

    谢谢,那我new的数组应该在什么时候释放呢?
      

  3.   

    用完了就可以删掉。
    把for循环里头的下面两行拿到循环外面
    m_LSMCurve=TRUE; 
    Invalidate(); 
      

  4.   

    这样还是不行。因为是每十个数做一次最小二乘法拟合,得到的斜率、y均值、x均值分别存放在m_pSlope、m_pLsy0和 m_pXAve中,每得到一次m_pSlope、m_pLsy0和 m_pXAve,就要绘一段曲线,所以还是不能拿到外面去。
      

  5.   

    按钮点击事件中把相关的画图信息生成好,
    然后调用一次重绘。在onDraw中根据生成的信息绘制就行了
      

  6.   

    哦,明白,那关键是我怎么保证每次生成的斜率、y均值、x均值就放在对应的m_pSlope、m_pLsy0和 m_pXAve所new的数组里了。
    我总觉得我的代码中缺了点什么,但又不会怎么改,可以具体指点一下吗?