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

📄 dlgjuanji.cpp

📁 对于卷积运算
💻 CPP
字号:
// dlgjuanji.cpp : implementation file
//

#include "stdafx.h"
#include "JUANJI.h"
#include "dlgjuanji.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// dlgjuanji dialog


dlgjuanji::dlgjuanji(CWnd* pParent /*=NULL*/)
	: CDialog(dlgjuanji::IDD, pParent)
{
	//{{AFX_DATA_INIT(dlgjuanji)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}


void dlgjuanji::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(dlgjuanji)
	DDX_Control(pDX, IDC_TEXT_SLIDER, m_slider);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(dlgjuanji, CDialog)
	//{{AFX_MSG_MAP(dlgjuanji)
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_fanzhe, Onfanzhe)
	ON_BN_CLICKED(IDC_yiwei, Onyiwei)
	ON_BN_CLICKED(IDC_reset, Onreset)
	ON_BN_CLICKED(IDC_startautodisplay, Onstartautodisplay)
	ON_BN_CLICKED(IDC_stopautodisplay, Onstopautodisplay)
	ON_WM_HSCROLL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// dlgjuanji message handlers

BOOL dlgjuanji::OnInitDialog() 
{


	// 调用默认OnInitDialog函数
	CDialog::OnInitDialog();

		speed=0;

    	LONG  i;
////////////////////////////
		//设置滑动条
		m_slider.SetRange(1000000,50000000);

	    m_slider.SetPos(5000000);
////////////////////////////////////////////////
	
	// 获取绘制直方图的标签
	CWnd* pWnd = GetDlgItem(IDC_COORD);
		
	// 指针
	CDC* pDC = pWnd->GetDC();

	//初始化复位标志
	reset=0;
	move=0;
	t=0;
		  //y[]复位
	for(i=0;i<=310;i++){y[i]=0.0;}
	

	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void dlgjuanji::OnPaint() 
{

		// 字符串
	CString str;
	
	// 循环变量
	LONG i;
	// 设备上下文
	CPaintDC dc(this);
	
	// 获取绘制坐标的文本框
	CWnd* pWnd = GetDlgItem(IDC_COORD);
	
	// 指针
	CDC* pDC = pWnd->GetDC();
	pWnd->Invalidate();
	pWnd->UpdateWindow();
	
	pDC->Rectangle(0,0,405,405);

	/////////////////////////////////////
		// 绿色画笔
	CPen*	pPenGreen=new CPen;
    pPenGreen->CreatePen(PS_SOLID,2,RGB(0,255,0));
	
	// 选中当前红色画笔,并保存以前的画笔
	CGdiObject* pOldPen = pDC->SelectObject(pPenGreen);
	
   //////////////////////// 绘制f1(t)横坐标轴
	pDC->MoveTo(0,110);
	pDC->LineTo(395,110);
	pDC->LineTo(390,105);
	pDC->MoveTo(395,110);
	pDC->LineTo(390,115);
	     //f1的刻度
	     pDC->MoveTo(0,110);
	     pDC->LineTo(0,105);
		 str.Format("-1");
	     pDC->TextOut(0, 111, str);

		 str.Format("0");
	     pDC->TextOut(100, 111, str);

		 pDC->MoveTo(200,110);
	     pDC->LineTo(200,105);
		 str.Format("1");
	     pDC->TextOut(200, 111, str);

		 pDC->MoveTo(300,110);
	     pDC->LineTo(300,105);
		 str.Format("2");
	     pDC->TextOut(300, 111, str);

		 

   /////////////////////f2的横坐标轴
	pDC->MoveTo(0,220);
	pDC->LineTo(395,220);
	pDC->LineTo(390,215);
	pDC->MoveTo(395,220);
	pDC->LineTo(390,225);
	     //f2的刻度
	     pDC->MoveTo(0,220);
	     pDC->LineTo(0,215);
		 str.Format("-1");
	     pDC->TextOut(0, 221, str);

		 str.Format("0");
	     pDC->TextOut(100, 221, str);

		 pDC->MoveTo(200,220);
	     pDC->LineTo(200,215);
		 str.Format("1");
	     pDC->TextOut(200, 221, str);

		 pDC->MoveTo(300,220);
	     pDC->LineTo(300,215);
		 str.Format("2");
	     pDC->TextOut(300, 221, str);



   ////////////////f3的横坐标轴
	pDC->MoveTo(0,390);
	pDC->LineTo(395,390);
	pDC->LineTo(390,385);
	pDC->MoveTo(395,390);
	pDC->LineTo(390,395);
	     //f3的刻度
	     pDC->MoveTo(0,390);
	     pDC->LineTo(0,385);
		 str.Format("-1");
	     pDC->TextOut(0, 391, str);

		 str.Format("0");
	     pDC->TextOut(100, 391, str);

		 pDC->MoveTo(200,390);
	     pDC->LineTo(200,385);
		 str.Format("1");
	     pDC->TextOut(200, 391, str);

		 pDC->MoveTo(300,390);
	     pDC->LineTo(300,385);
		 str.Format("2");
	     pDC->TextOut(300, 391, str);


    
	
	
	
   /////////////////////////////////////////////////
   /////////////////////////////////////////////////
	///////////绘制纵坐标
	pDC->MoveTo(100,110);
	pDC->LineTo(100,0);
	pDC->LineTo(105,5);
	pDC->MoveTo(100,0);
	pDC->LineTo(95,5);
		// 
	    str.Format("f1(t)");
	    pDC->TextOut(120, 0, str);
		pDC->MoveTo(100,10);
	    pDC->LineTo(105,10);
		str.Format("1");
	    pDC->TextOut(90, 5, str);

    //
	pDC->MoveTo(100,220);
	pDC->LineTo(100,120);
	pDC->LineTo(105,125);
	pDC->MoveTo(100,120);
	pDC->LineTo(95,125);
		// 
	    str.Format("f2(t)");
	    pDC->TextOut(120, 125, str);
		pDC->MoveTo(100,120);
	    pDC->LineTo(105,120);
		str.Format("1");
	    pDC->TextOut(85, 115, str);
	//
	pDC->MoveTo(100,390);
	pDC->LineTo(100,230);
	pDC->LineTo(105,235);
	pDC->MoveTo(100,230);
	pDC->LineTo(95,235);
		// 
	    str.Format("f1(t)*f2(t)");
	    pDC->TextOut(120, 235, str);
		pDC->MoveTo(100,290);
	    pDC->LineTo(105,290);
		str.Format("0.5");
	    pDC->TextOut(80, 285, str);

		pDC->MoveTo(100,340);
	    pDC->LineTo(105,340);
		str.Format("0.25");
	    pDC->TextOut(70, 335, str);

  ///////////////////////////////////////////
    //以下画填充的矩形
	pDC->FillSolidRect(100,10,100,100,190);
		// 创建画笔对象
	CPen* pPenRed = new CPen;	
	// 红色画笔
	pPenRed->CreatePen(PS_SOLID,1,RGB(200,0,0));
    pOldPen = pDC->SelectObject(pPenRed);


	//以下分是否复位
   if(reset==0) 
   {
	   //画F2
	   for(i=100;i<=200;i++)
	   {
		pDC->MoveTo(i,220);
	    pDC->LineTo(i,220-i+100);
		
	   }

   }
   else  //反折
   {
	   //画反折后的F2
	   for(i=100;i<=200;i++)
	   {
		pDC->MoveTo(200-i+t,220);
	    pDC->LineTo(200-i+t,220-i+100);

	   }

   }

 

   //以下绘制f3
   for(i=0;i<=t;i++)
   {
	   	pDC->MoveTo(100+i,390);
	    pDC->LineTo(100+i,390-(int)(y[i]*1.0/5000));//5000坐标归一化

   }
    
	

	
}

void dlgjuanji::Onfanzhe() 
{
	reset=1;
			// 重绘
	InvalidateRect(m_MouseRect, TRUE);

	
}

void dlgjuanji::Onyiwei() 
{

	LONG i,j;
	if(t<300)
	{
		t=t+5;
	
				//以下进行卷积运算
	     	for(i=0;i<=t;i++)    //i->t
			{
			    y[i]=0;
			    for(j=0;j<=i;j++)   //j->tao:0~t
				{
				y[i]=y[i]+f1(j)*f2(j,i);
				}

			}

	}


	
			// 重绘
	InvalidateRect(m_MouseRect, TRUE);

	
}
	

void dlgjuanji::Onreset() 
{
	reset=0;
	t=0;
	LONG i;
			  //y[]复位
	for(i=0;i<=310;i++){y[i]=0.0;}
	
		// 重绘
	InvalidateRect(m_MouseRect, TRUE);



	
}

LONG dlgjuanji::f1(LONG x)
{
	LONG y;
	if(x>=0&&x<=100)
	{
		y=100;
	}
	else
	{
		y=0;
	}
	return y;

}

LONG dlgjuanji::f2(LONG x, LONG t)
{
	LONG y; 
	if(x>=(t-100)&&x<=t)
	{
		y=t-x;      
	}
	else
	{y=0;}
	 return y;

}

void dlgjuanji::Onstartautodisplay() 
{
	LONG i,j;
	//1.反折
		reset=1;
			// 重绘
	 OnPaint();
	 //延时一会儿
	  i=0;
	  while(i<speed)	{i++;}

	//2.移位、相乘、累加
			
	while(t<300)
	{
		t=t+1;
	
				//以下进行卷积运算
	     	for(i=0;i<=t;i++)    //i->t
			{
			    y[i]=0;
			    for(j=0;j<=i;j++)   //j->tao:0~t
				{
				y[i]=y[i]+f1(j)*f2(j,i);
				}

			}


		 //重绘
		 OnPaint();			
	     //延时
	     i=0;
	     while(i<speed)
		 {i++;}


	}//while(t<300)


	
}

void dlgjuanji::Onstopautodisplay() 
{

	reset=0;
	t=0;
	LONG i;
			  //y[]复位
	for(i=0;i<=310;i++){y[i]=0.0;}
	
		// 重绘
	InvalidateRect(m_MouseRect, TRUE);
	
}


void dlgjuanji::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// 读取滑动条的数值
	//	UpdateData();
	if((CSliderCtrl*)pScrollBar==&m_slider)
	{
		speed=m_slider.GetPos();
	    

	}
	 
	//UpdateData(FALSE);
	
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

⌨️ 快捷键说明

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