⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 studydlg.cpp

📁 信号消燥
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			temp_vector.Add(atof(data1));
		   } 
		}while(k!=-1);

		if (InitMatrix==FALSE)
		{
			temp_matrix.Set(1,temp_vector.Size());
			temp_matrix.SetLine(temp_vector,1);
			InitMatrix=TRUE;

		}
		else
		{
			temp_matrix.AddLine(temp_vector);
		}
		
        temp_vector.Destroy();
	}
		data2=temp_matrix;
}

void CStudyDlg::DataPaint()
{
	//用于绘制数据曲线;
	//当绘制仿真数据时,三组数据分别为:原始信号,噪声信号,含噪信号;
	//当绘制文本数据时,将绘制每一组数据;
	//次函数绘制的为DrawData矩阵中数据,调用之前必须要先将此矩阵赋值;
	//编写时间2006.09.27
	
	
  //获取数据DataOriginal中的信息;
	int column=DrawData.ColumSize();  //列数
	int row=DrawData.LineSize();      //行数

  //获得Dc及绘图区域;
	CWnd *pWnd=GetDlgItem(IDC_Pic);
	CDC *pDc=pWnd->GetDC();
	CRect PicRgn;
	::GetClientRect(pWnd->m_hWnd,PicRgn);
	pDc->SelectStockObject(DKGRAY_BRUSH);
	pDc->Rectangle(PicRgn);
   CRect DrawRgn(PicRgn.left+PicRgn.Width()/12.0,PicRgn.top+PicRgn.Height()/12.0,
		PicRgn.right-PicRgn.Width()/12.0,PicRgn.bottom-PicRgn.Height()/12.0); //绘图区域大小;
    pDc->SelectStockObject(BLACK_BRUSH);  //创建黑色的笔刷;

	//矩形相关信息
	double Rect_height=DrawRgn.Height()/column;//注意:此处的高度是包括矩阵间距离的
	double Rech_width=DrawRgn.Width();  

	//针对每列数据进行图形绘制;
	for (int i=0;i<column;i++)
	{
		//确定矩形的左上角及右下角坐标
		CRect Rect(DrawRgn.left,DrawRgn.top+i*Rect_height,DrawRgn.right,
	DrawRgn.top+Rect_height*(i+0.8));  //调节此处的0.8,可以调节矩阵间距的大小;
	
		//获得左下角坐标
		double Rect_ld_X=Rect.left;
		double Rect_ld_Y=Rect.bottom;
		//创建一支白色的笔来绘制矩形的边框
		CPen Pen(PS_SOLID,1,RGB(255,255,255));
		CPen *pOldpen=pDc->SelectObject(&Pen);
		pDc->Rectangle(&Rect);
		pDc->SelectObject(pOldpen);
		
		//获得数据信息
		vector temp_column;
		temp_column.GetColum(DrawData,i+1);
		int maxX=row;
		int  minX=1;
		double maxY=temp_column.Max();
		double minY=temp_column.Min();
	//	 double IntervalX,IntervalY;
		double IntervalY;
		if (maxX!=minX)
		{
				IntervalX=Rect.Width()/double(maxX-minX);//注意:此处必须要进行强制转换,否则会出现误差;
		}
		else
		{
                 IntervalX=0;//??需要考虑
		}
		if (maxY!=minY)
		{
			IntervalY=Rect.Height()/double(maxY-minY);
		}
		else
		{
			IntervalY=Rect.Height()/2.0;//??
		}
	    
		CPoint point_begin;
		point_begin.x=Rect.left;
		point_begin.y=Rect_ld_Y-(temp_column[1]-minY)*IntervalY;//注意此处必须为"-"号;
		pDc->MoveTo(point_begin);

		//为不同的矩阵选择不同的画笔
		CPen *pOldpen1;
		CPen penRed(PS_SOLID,1,RGB(255,0,0));
		CPen penGreen(PS_SOLID,1,RGB(0,255,0));
		CPen penBlue(PS_SOLID,1,RGB(0,0,255));
		switch(i%3) {
		case 0:
            pOldpen1=pDc->SelectObject(&penRed);
			break;
		case 1:
		    
            pOldpen1=pDc->SelectObject(&penGreen);
			break;
		case 2:
		    
            pOldpen1=pDc->SelectObject(&penBlue);
			break;
		default:;
		}

		//开始绘制曲线
		CPoint point_mid;
		for (int j=1;j<row;j++)
		{
           point_mid.x=Rect.left+j*IntervalX;
		   point_mid.y=Rect_ld_Y-(temp_column[j+1]-minY)*IntervalY;
		   pDc->LineTo(point_mid);
		}

		//释放资源
		pDc->SelectObject(pOldpen1);


	}

	CPen penYellow(PS_SOLID,1,RGB(255,255,0));
	CPen *pOldpen2=pDc->SelectObject(&penYellow);
    if (Cut_X_Y.x!=0)
	{	
		pDc->MoveTo(Cut_X_Y.x,DrawRgn.top);
 	pDc->LineTo(Cut_X_Y.x,(DrawRgn.Height()+DrawRgn.top)*(1.0-1.0/(5*column)));
		
	}
    if(Cut_X_Y.y!=0)
	{
			pDc->MoveTo(Cut_X_Y.y,DrawRgn.top);
		    pDc->LineTo(Cut_X_Y.y,(DrawRgn.Height()+DrawRgn.top)*(1.0-1.0/(5*column)));
	}
     pDc->SelectObject(pOldpen2);
			pWnd->ReleaseDC(pDc);
}

HBRUSH CStudyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here

		
		// TODO: Return a different brush if the default is not desired
	
	return hbr;

}

void CStudyDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
		CWnd *pWnd=GetDlgItem(IDC_Pic);
	CDC *pDc=pWnd->GetDC();
	CRect PicRgn;
	::GetClientRect(pWnd->m_hWnd,PicRgn);
	pDc->SelectStockObject(DKGRAY_BRUSH);
	pDc->Rectangle(PicRgn);
	pWnd->ReleaseDC(pDc);
	IsCreat=FALSE;
}

void CStudyDlg::OnButton1() 
{
//	    CFileDialog FDlg(TRUE);
//		FDlg.m_ofn.lpstrFilter=("text Files(*.txt)\0*.txt\0所有文件(*.*)\0*.*\0\0");
//		
//		if (IDOK==FDlg.DoModal())
//		{
//			matrix a(2,2),b(2,1),c(1,2);
//	        a.Init(0.0,1.0,-2.0,-3.0);
//	        b.Init(0.0,1.0);
//	        c.Init(1.0,0.0);
//
//		vector u,y,Init(2);
//		Init.Init(0.0,0.0);
//		Load(FDlg.GetFileName(),DataOriginal);
//		u.GetColum(DataOriginal,1);
//        wavelet.RungeKuttaConstStep(u,y,a,b,c,Init);
//        y.Print(16);
// 		}
//vector u(100),y;
//u.Const(1.0);
// wavelet.Runge_Kutta(u,y,-2.0,-3.0,1.0,0.0,0.0);
// y.Print();
vector data;
data.GetColum(DataOriginal,3);
//data.Print(16);
//data.GetColum(DataOriginal,3);
//data.Const(1.0);
wavelet.wavedec(data,5,"db",8);
//wavelet.dwt(data,"db",6);
//wavelet.idwt(wavelet.cA,wavelet.cD,wavelet.Lo_R,wavelet.Hi_R,"per");
wavelet.wdencmp("hard");
//wavelet.waverec(wavelet.wavedec_C,wavelet.wavedec_L);
DrawData.AddColum(wavelet.Re_Data);
DrawData.DelColum(2);
DataPaint();




}

void CStudyDlg::OnButton4() 
{
	
	// TODO: Add your control notification handler code here
	UpdateData();
	CButton* pCheck=(CButton*)GetDlgItem(IDC_CHECK1);
	if (pCheck->GetCheck())
	{
		//获得所要分解的数据;
		vector data;
        data.GetColum(DataOriginal,atoi(m_numofdata));
        wavelet.wavedec(data,atoi(m_noLayer),m_wavetype,atoi(m_num),"per");
	}
	else
	{
        vector data;
        data.GetColum(DataOriginal,3);
        wavelet.wavedec(data,atoi(m_noLayer),m_wavetype,atoi(m_num),"per");
	}

	((CComboBox *)GetDlgItem(IDC_COMBO9))->ResetContent();//将所有数据从组合框中删除;
	CString ii;
   //for (int i=1;i<=4;i++)
	  for (int i=1;i<=atoi(m_noLayer);i++)
   {
           ii.Format("%d",i);  //此函数将int转化成CString型;
           ((CComboBox *)GetDlgItem(IDC_COMBO9))->AddString(ii);
   }
((CComboBox *)GetDlgItem(IDC_COMBO9))->SetCurSel(atoi(m_noLayer)-1);
  
//CoefSelect(atoi(m_noLayer), atoi(m_noLayer));
GetDlgItem(IDC_BUTTON6)->EnableWindow(true);
}

void CStudyDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CWnd *pWnd=GetDlgItem(IDC_Pic);
	CDC *pDc=pWnd->GetDC();
	CRect PicRgn;
	::GetClientRect(pWnd->m_hWnd,PicRgn);
	CRect DrawRgn(PicRgn.left+PicRgn.Width()/12.0,PicRgn.top+PicRgn.Height()/12.0,
		PicRgn.right-PicRgn.Width()/12.0,PicRgn.bottom-PicRgn.Height()/12.0);
	Draw_X=DrawRgn.left;
  CRect   rect,rect1;  
  GetDlgItem(IDC_Pic)->GetWindowRect(rect); 
 ::GetCursorPos(&point); 
 //rect1.left=rect.left+DrawRgn.left;
  rect1.left=rect.left+PicRgn.Width()/12.0;
 rect1.top=rect.top;
 //rect1.right=rect1.left+rect1.Width();
  rect1.right=rect.right-PicRgn.Width()/12.0;
 rect1.bottom=rect.bottom;
   if(rect1.PtInRect(point))   
 {   
    vector temp(1);
	temp[1]=point.x-rect.left;
	if (Cut_X_Y.x==0)
	{
		Cut_X_Y.x=temp[1];
		DataPaint();
	}
	else if(Cut_X_Y.y==0)
	{
		Cut_X_Y.y=temp[1];
		DataPaint();
	}
	else
	{
		Cut_X_Y.x=0;
		Cut_X_Y.y=0;
		DataPaint();
	}

   }
	
	CDialog::OnLButtonDblClk(nFlags, point);
}

void CStudyDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	wavelet.waverec(wavelet.wavedec_C,wavelet.wavedec_L);
}

void CStudyDlg::OnCut() 
{
	// TODO: Add your control notification handler code here
	int start,stop;
if (Cut_X_Y.x>Cut_X_Y.y)
{
	int temp;
	temp=Cut_X_Y.x;
	Cut_X_Y.x=Cut_X_Y.y;
	Cut_X_Y.y=temp;
}
 start=(Cut_X_Y.x-Draw_X)/IntervalX;
 stop=(Cut_X_Y.y-Draw_X)/IntervalX;
 matrix temp;
 temp.GetLineBlock(DrawData,start,stop);
 DrawData=temp;
 Cut_X_Y=(0,0);
 DataOriginal=DrawData;
DataPaint();
}

void CStudyDlg::CoefSelect(int L,int i)
{
	
  if (L==i)
  {
	  vector temp;
	  DrawData.Set(wavelet.wavedec_L[1],1);
	  temp.GetLeft(wavelet.wavedec_C,wavelet.wavedec_L[1]);
	  DrawData.AddColum(temp);
	  temp.GetMid(wavelet.wavedec_C,wavelet.wavedec_L[1]+1,wavelet.wavedec_L[2]);
	  DrawData.AddColum(temp);
	  DrawData.DelColum(1);
	  DataPaint();
  }
  else
  {   int len=0;
	  for (int j=1;j<=L+1-i;j++)
	  {
		  len+=wavelet.wavedec_L[j];
	  }
	  vector temp;
	  temp.GetMid(wavelet.wavedec_C,len+1,wavelet.wavedec_L[L+2-i]);
	  DrawData.Set(wavelet.wavedec_L[L+2-i],1);
      DrawData.AddColum(temp);
	  DrawData.DelColum(1);
	  DataPaint();
  }
}

void CStudyDlg::OnEditchangeCombo9() 
{
	// TODO: Add your control notification handler code here
//	CoefSelect(atoi(m_noLayer), atoi(m_Coef));
}



void CStudyDlg::OnDenoise() 
{
	// TODO: Add your control notification handler code here
	if (m_type==0)
	{
		wavelet.wdencmp("soft");
	}
	else
	{
         wavelet.wdencmp("hard");
	}

	CButton* pCheck=(CButton*)GetDlgItem(IDC_CHECK1);
UpdateData();
vector temp;
	if (pCheck->GetCheck())
	{   
		
		DrawData.Set(DataOriginal.LineSize(),1);
		DrawData.AddColum(temp.GetColum(DataOriginal,atoi(m_numofdata)));
        DrawData.AddColum(wavelet.Re_Data);
        DrawData.DelColum(1);
	}
	else
	{
  DrawData.Set(DataOriginal.LineSize(),1);
  DrawData.AddColum(temp.GetColum(DataOriginal,1));
  DrawData.AddColum(temp.GetColum(DataOriginal,3));
  DrawData.AddColum(wavelet.Re_Data);
  DrawData.DelColum(1);

	}
	DataPaint();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -