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

📄 hopfieldview.cpp

📁 一个hopfield程序
💻 CPP
字号:
// hopfieldView.cpp : implementation of the CHopfieldView class
//

#include "stdafx.h"
#include "hopfield.h"

#include "hopfieldDoc.h"
#include "hopfieldView.h"

extern void init();
extern int  go_one_step(int* to_recog);
extern int  is_same( int* s,int*t,int length );
extern int  is_converse( int*s,int*t,int length );
extern int X[4][56];

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

/////////////////////////////////////////////////////////////////////////////
// CHopfieldView

IMPLEMENT_DYNCREATE(CHopfieldView, CView)

BEGIN_MESSAGE_MAP(CHopfieldView, CView)
	//{{AFX_MSG_MAP(CHopfieldView)
	ON_COMMAND(ID_CLEAR, OnClear)
	ON_COMMAND(ID_CONTINUE, OnContinue)
	ON_COMMAND(ID_EXAMPLE, OnExample)
	ON_COMMAND(ID_RECOGIZE, OnRecogize)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHopfieldView construction/destruction

CHopfieldView::CHopfieldView()
{
	// TODO: add construction code here
	inputstate = 0;
	displayinput = 0;
	displayoutput = 0;
	displaysample = 0;
	doingrepaint = 0;

	int x2,y2;
	int step=25;
	int x=130;
	int y=100;
	
	for(int i=0;i<56;i++){
		x2=x+step;
		y2=y+step;
		Rect_input[i].SetRect(x,y,x2,y2);
		if(i%7==6)
		{
			y+=step+2; 
			x-=step*6+12;
		}
		else
			x+=step+2;
	}	

	x=480;
	y=100;

	for(i=0;i<56;i++){
		x2=x+step;
		y2=y+step;
		Rect_output[i].SetRect(x,y,x2,y2);
		if(i%7==6)
		{
			y+=step+2; 
			x-=step*6+12;
		}
		else
			x+=step+2;
	}	
	init();
}

CHopfieldView::~CHopfieldView()
{
}

BOOL CHopfieldView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHopfieldView drawing

void CHopfieldView::OnDraw(CDC* pDC)
{
	CHopfieldDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if( displaysample )
		DrawSample(pDC);
	if( displayinput )
	{
		for(int i=0;i<56;i++)
		{
			if( inputarray[i]<0.0001 )
				pDC->FillSolidRect(Rect_input[i],RGB(0,0,0) );
			else
				pDC->FillSolidRect(Rect_input[i],RGB(0,0,255) );
		}
	}

	if( displayoutput )
	{
		for(int i=0;i<56;i++)
		{
			if( outputarray[i]<0.0001 )
				pDC->FillSolidRect(Rect_output[i],RGB(0,0,0) );
			else
				pDC->FillSolidRect(Rect_output[i],RGB(0,0,255) );
		}			
	}
}

/////////////////////////////////////////////////////////////////////////////
// CHopfieldView diagnostics

#ifdef _DEBUG
void CHopfieldView::AssertValid() const
{
	CView::AssertValid();
}

void CHopfieldView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CHopfieldDoc* CHopfieldView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHopfieldDoc)));
	return (CHopfieldDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHopfieldView message handlers

void CHopfieldView::OnClear() 
{
	// TODO: Add your command handler code here
	inputstate = 1;
	displayinput = 1;
	displayoutput = 0;
	displaysample = 0;

	for(int count=0;count<56;count++)
	{
		inputarray[count]=0;
		outputarray[count]=0;
	}
	Invalidate();
}

void CHopfieldView::OnContinue() 
{
	// TODO: Add your command handler code here
	int result = -1;
	if( go_one_step(outputarray)==0 )
	{
		for(int i=0;i<4;i++)
		{
			if( is_same(outputarray,X[i],56) )
			{
				::AfxMessageBox("正确识别");
				result = 1;
				break;
			}
			if( is_converse(outputarray,X[i],56) )
			{
				::AfxMessageBox("识别的结果和输入模式相反");
				result = 2;
				break;
			}
		}
		if( result==-1 )
			::AfxMessageBox("识别的结果是未知的稳定状态");
	}
	Invalidate();	
}

void CHopfieldView::OnExample() 
{
	// TODO: Add your command handler code here
	inputstate =0;
	displayinput = 0;
	displayoutput = 0;
	displaysample = 1;

	Invalidate();		
}

void CHopfieldView::OnRecogize() 
{
	// TODO: Add your command handler code here
	inputstate = 1;
	displayinput = 1;
	displayoutput = 1;
	displaysample = 0;
	doingrepaint = 1;

    for(int count=0;count<56;count++)
		outputarray[count] = inputarray[count];
	go_one_step(outputarray);
	Invalidate();	
}

void CHopfieldView::DrawSample(CDC *pDC)
{
   	CRect Rect_temp[56];
	int x,y,x2,y2,startx,starty;
	int step=14;	
	int whichinput = 0;

	pDC->TextOut(200,110,"共有四个样本,输入为7×8的字母");	

	starty = 200 ;

	for(startx=30;startx<700;startx+=200)
	{
		x = startx;
		y = starty;

		for(int i=0;i<56;i++)
		{
			x2=x+step;
			y2=y+step;
			Rect_temp[i].SetRect(x,y,x2,y2);

			if(i%7==6)
			{
				y+=step+2; 
				x-=step*6+12;
			}
			else
				x+=step+2;
		}	

		for(i=0;i<56;i++)
		{
			if( X[whichinput][i]<0.0001 )
				pDC->FillSolidRect(Rect_temp[i],RGB(0,0,0) );
			else
				pDC->FillSolidRect(Rect_temp[i],RGB(0,0,255) );
		}
		whichinput++;
	}	
}

void CHopfieldView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	if( inputstate!=0 )
	{
		for(int i=0;i<56;i++)
		{
			if (Rect_input[i].PtInRect(point)) {
				if(inputarray[i]<0.001) 
					inputarray[i]=1;
				else
					inputarray[i]=0;
				InvalidateRect(Rect_input[i]);
			}
		}
	}
	
	CView::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

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