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

📄 inputwnd.cpp

📁 Visual C++源程序;利用神经网络进行0-9十个数字图像的识别。
💻 CPP
字号:
// InputWnd.cpp : implementation file
//

#include "stdafx.h"
#include "bp.h"
#include "InputWnd.h"

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

/////////////////////////////////////////////////////////////////////////////
// CInputWnd

IMPLEMENT_DYNAMIC(CInputWnd, CWnd)

CInputWnd::CInputWnd()
{
	//背景色画刷
	m_brBack.CreateSolidBrush (RGB(255,255,255));
	
	//方块填充画刷
	m_brSquare.CreateSolidBrush (RGB(255,0,0));
	
	//网格线画刷
	m_hPen.CreatePen (PS_SOLID,1,RGB(0,192,192));
   	
	m_bInitDraw=false;
	
	//初始化输入矩阵
/**/
	for(int i=0;i<LEN;i++)
		for(int j=0;j<LEN;j++)
		{
			m_bArray[i][j]=false;
			m_InputArray[i][j]=0;       
		}

		
}

CInputWnd::~CInputWnd()
{
/*
	if(m_hFile!=INVALID_HANDLE_VALUE)
	{
		if (m_bTrain){
			OVERLAPPED Overlapped={0};
			
			DATA d;
			
			memcpy(d.e ,e,sizeof(E)*10);
			memcpy(&(d.WE),&WE,sizeof(WEIGHT)); 
			
			//把训练过的权值写回文件
			::WriteFile (m_hFile,&d,sizeof(DATA),NULL,&Overlapped);
		}
		::CloseHandle(m_hFile);
	}
*/
	
}


BEGIN_MESSAGE_MAP(CInputWnd, CWnd)
	//{{AFX_MSG_MAP(CInputWnd)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

void CInputWnd::OnPaint()
{
	CPaintDC dc(this); // device context for painting
    
	//重绘信息
	DrawInputWnd(&dc);
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CWnd::OnPaint()
}

// 画出输入框架
bool CInputWnd::DrawInputWnd(CPaintDC *pDC)
{
	
	CBrush *pOldBr=pDC->SelectObject (&m_brBack);
    float sizeHeight=0.0;
	float sizeWidth=0.0;
   	float newsize=0.0;
    
	this->GetClientRect(&m_rectThis);
    sizeHeight=m_rectThis.Height ()/LENF;//求出方块的长
	float x=0.0;
	sizeWidth=m_rectThis.Width ()/LENF;//方块的宽
	float y=0.0;
	int i,j;
	if(m_bInitDraw==false){    //看方块是否已经被写上
   
	for( i=0;i<LEN;i++)
	{
		for( j=0;j<LEN;j++)
		{
           m_rectArray[i][j].left =x;
		   m_rectArray[i][j].right =m_rectArray[i][j].left+sizeWidth;
		   m_rectArray[i][j].top =y;
		   m_rectArray[i][j].bottom =m_rectArray[i][j].top+sizeHeight ;
		   y=y+sizeHeight;
		}
		y=0.0;
		x=x+sizeWidth;
	}
	      m_bInitDraw=true;
	}

	pDC->Rectangle (&m_rectThis);
	pDC->SelectObject (&m_hPen);

	
	
	newsize=0;

	for( i=0;i<=LEN;i++,newsize+=sizeHeight)
	{
	  pDC->MoveTo (0,newsize);
	  pDC->LineTo (m_rectThis.Width (),newsize);       //画背景网格
	 
	}

	newsize=0;
	for( i=0;i<=LEN;newsize+=sizeWidth,i++)
	{
	  pDC->MoveTo (newsize,0);
	  pDC->LineTo (newsize,m_rectThis.Height ());       //画背景网格
	}

	pDC->SelectObject (&m_brSquare);
	for( i=0;i<LEN;i++)
		for( j=0;j<LEN;j++)
		{
			if(m_bArray[i][j]==true)
				pDC->Rectangle (&m_rectArray[i][j]);     //填充小方块
		}

	pDC->SelectObject (pOldBr);
	return false;
}


void CInputWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
	for(int i=0;i<LEN;i++)
	{
		for(int j=0;j<LEN;j++)
		{
			if(m_rectArray[i][j].PtInRect (point)&&m_bArray[i][j]==false)
			{
			 m_bArray[i][j]=true;
             this->InvalidateRect (&m_rectArray[i][j]);
			 break;
			}
		}
	}
	
	CWnd::OnLButtonDown(nFlags, point);
}

void CInputWnd::OnMouseMove(UINT nFlags, CPoint point)
{

    if(nFlags==MK_LBUTTON)
	{
	for(int i=0;i<LEN;i++)
	{
		for(int j=0;j<LEN;j++)
		{
			if(m_rectArray[i][j].PtInRect (point)&&m_bArray[i][j]==false)
			{
			 m_bArray[i][j]=true;
             this->InvalidateRect (&m_rectArray[i][j]);
			 break;
			}
		}
	}
	}
	CWnd::OnMouseMove(nFlags, point);
}



// 获取经过调整的输入层数值,或者样本数值
bool CInputWnd::GetInput(int index)
{

//////////////////////////////////////////////////////////////////////////////
/*                       调整坐标使输入居中                                 */

	int iLeft=LEN,iRight=0,iTop=LEN,iBottom=0;
	int i,j,t;
	for( i=0;i<LEN;i++)
	{
		for( j=0;j<LEN;j++)
		{
			if(m_bArray[i][j])
			{
               if (iTop>j)
				   iTop=j;             //识别方阵的最左
			   
			   if(iBottom<j)            
				   iBottom=j;           //方阵的最右
			   
			   if(iLeft>i)
				    iLeft=i;            //方阵的最上
			   
			   if(iRight<i)
				    iRight=i;         //方阵的最下
			}
		}
	}

	for( i=0;i<LEN;i++)            //平移坐标
		for( j=0;j<LEN;j++)
			m_InputArray[i][j]=0;
			
    int xMiddle=0,yMiddle=0;
	xMiddle=(iRight-iLeft)/2+1;          
	yMiddle=(iBottom-iTop)/2+1;           

	iLeft=iLeft+xMiddle;              //中间点的x
	iTop=iTop+yMiddle;                //中间点的y



	int dx=iLeft-LEN/2;                  //求出坐标差
	int dy=iTop-LEN/2;                  //求出坐标差


	
	for( i=0;i<LEN;i++)            //平移坐标
		for( j=0;j<LEN;j++){
			if(m_bArray[i][j])
			  m_InputArray[i-dx][j-dy]=1;
		}
	for( i=0;i<LEN;i++)
		for( j=0;j<LEN;j++)
			m_bArray[i][j]=false;

	for( i=0;i<LEN;i++)
		for( j=0;j<LEN;j++)
			if(m_InputArray[i][j]==1)
              m_bArray[i][j]=true;
    
	this->Invalidate ();
	return false;
}



// 初始化样本,如果存在文件信息从文件里面调入信息
bool CInputWnd::Initialization(void)
{
	return false;
}

⌨️ 快捷键说明

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