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

📄 sortview.cpp

📁 模式识别分类 内有聚类算法.分段线性算法
💻 CPP
字号:
// sortView.cpp : implementation of the CSortView class
//

#include "stdafx.h"
#include "sort.h"

#include "sortDoc.h"
#include "sortView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSortView

IMPLEMENT_DYNCREATE(CSortView, CView)

BEGIN_MESSAGE_MAP(CSortView, CView)
	//{{AFX_MSG_MAP(CSortView)
	ON_COMMAND(ID_MMSAMPLE, OnMmsample)
	ON_COMMAND(ID_MMSORTBEGIN, OnMmsortbegin)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSortView construction/destruction

CSortView::CSortView()
{
	// TODO: add construction code here
	m_nsampleCount=0;
	m_ndrawFlag=0;
	m_ptMouse.x=0;
	m_ptMouse.y=0;
	m_ntypeCnt=2;
	m_nEndFlag=0;
	pen.CreatePen(PS_SOLID,1,RGB(255,0,255));

}

CSortView::~CSortView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSortView drawing

void CSortView::OnDraw(CDC* pDC)
{
	CSortDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	CString str;
	str.Format("x=%d,y=%d   ",m_ptMouse.x,m_ptMouse.y);
	pDC->TextOut(0,0,str);
	if(m_ndrawFlag==1)
	{
		OnMaxminInput();        //最大最小聚类样本初始化
		m_ndrawFlag=0;
	}
	else if(m_ndrawFlag==2)
	{
		OnMaxminSort();			//最大最小聚类分类
		m_ndrawFlag=-1;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CSortView printing

BOOL CSortView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CSortView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CSortView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CSortView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSortView message handlers

void CSortView::OnMmsample() 
{
	// TODO: Add your command handler code here
	m_nsampleCount=0;
	m_ndrawFlag=0;
	m_ptMouse.x=0;
	m_ptMouse.y=0;
	m_ntypeCnt=2;
	m_nEndFlag=0;
	
	InvalidateRect(NULL);
	
}


int CSortView::GetDistance(int x1, int y1, int x2, int y2)
{
	int result;
	result=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
	return result;

}

void CSortView::OnMmsortbegin() 
{
	// TODO: Add your command handler code here
	m_ndrawFlag=2;
	InvalidateRect(CRect(0,0,100,20));
}

void CSortView::OnMaxminSort()  //对样本用最大最小算法进行分类,并用不同颜色区分
{
	CString str;
	CClientDC dc(this);
	CBrush br1,br2,br3,br4,*oldbr;
	int i,j,k,l=0;
	int m_ntempDis,m_nmaxDis=0,m_nminDis,m_nmaxminDis=0,m_nsamNo;

	m_nsampleStore[0][0]=1;
	m_ntypeStore[0]=0;
	
	if(m_nsampleCount<2)
	{
		AfxMessageBox("Less than two types, error! Plesas input again.");
		m_nEndFlag=1;
		m_ndrawFlag=-1;
		return;
	}
	for(i=1;i<m_nsampleCount;i++)
	{
		m_ntempDis=GetDistance(m_nsampleStore[i][1],m_nsampleStore[i][2],m_nsampleStore[0][1],m_nsampleStore[0][2]);
		if(m_nmaxDis<m_ntempDis)
		{
			m_nmaxDis=m_ntempDis;
			m_nsamNo=i;
		}
	}
	m_nsampleStore[m_nsamNo][0]=2;
	m_ntypeStore[1]=m_nsamNo;
	m_nmaxDis/=9;

	for(;m_nEndFlag!=1;)
	{
		for(i=1;i<m_nsampleCount;i++)
			if(m_nsampleStore[i][0]==0)
			{
				m_nminDis=GetDistance(m_nsampleStore[i][1],m_nsampleStore[i][2],m_nsampleStore[0][1],m_nsampleStore[0][2]);
				for(j=1;j<m_ntypeCnt;j++)
				{
					k=m_ntypeStore[j];
					m_ntempDis=GetDistance(m_nsampleStore[i][1],m_nsampleStore[i][2],m_nsampleStore[k][1],m_nsampleStore[k][2]);
					if(m_nminDis>m_ntempDis)
						m_nminDis=m_ntempDis;
				}
				if(m_nminDis>m_nmaxminDis)
				{
					m_nmaxminDis=m_nminDis;
					m_nsamNo=i;
				}
			}
		
		if(m_nmaxminDis>m_nmaxDis)
		{
			m_ntypeStore[m_ntypeCnt]=m_nsamNo;
			m_ntypeCnt++;
			m_nsampleStore[m_nsamNo][0]=m_ntypeCnt;
			m_nmaxminDis=0;
			m_nEndFlag=0;
		}
		else
			m_nEndFlag=1;

	}

	for(i=1;i<m_nsampleCount;i++)
		if(m_nsampleStore[i][0]==0)
		{
			m_nminDis=GetDistance(m_nsampleStore[i][1],m_nsampleStore[i][2],m_nsampleStore[0][1],m_nsampleStore[0][2]);
			m_nsampleStore[i][0]=1;
			for(j=1;j<m_ntypeCnt;j++)
			{
				k=m_ntypeStore[j];
				m_ntempDis=GetDistance(m_nsampleStore[i][1],m_nsampleStore[i][2],m_nsampleStore[k][1],m_nsampleStore[k][2]);
				if(m_nminDis>m_ntempDis)
				{
					m_nminDis=m_ntempDis;
					m_nsampleStore[i][0]=j+1;
				}
			}
				
		}

	br1.CreateSolidBrush(RGB(255,0,0));
	br2.CreateSolidBrush(RGB(0,255,0));
	br3.CreateSolidBrush(RGB(0,0,255));
	br4.CreateSolidBrush(RGB(255,255,0));

	for(i=0;i<m_nsampleCount;i++)
	{
		j=m_nsampleStore[i][0];
			
		switch(j)
		{
			case 1:
				oldbr=dc.SelectObject(&br1);
				break;
			case 2:
				oldbr=dc.SelectObject(&br2);
				break;
			case 3:
				oldbr=dc.SelectObject(&br3);
				break;
			case 4:
				oldbr=dc.SelectObject(&br4);
				break;
			case 5:
				dc.SelectStockObject(GRAY_BRUSH);
				break;
			case 6:
				dc.SelectStockObject(BLACK_BRUSH);
				break;
			default:
				dc.SelectStockObject(DKGRAY_BRUSH);
				break;
		}
		
		dc.Ellipse(m_nsampleStore[i][1]-10,m_nsampleStore[i][2]-10,m_nsampleStore[i][1]+10,m_nsampleStore[i][2]+10);
			
		if(j<=4)
			dc.SelectObject(oldbr);
	}
	str.Format("Type No:%d   ",m_ntypeCnt);
	dc.TextOut(0,40,str);
}

void CSortView::OnMaxminInput()  //输入待分类样本,并在窗口显示
{
	CClientDC dc(this);
	CPen *oldpen;
	oldpen=dc.SelectObject(&pen);
	CString str;
	int i;
	for(i=0;i<m_nsampleCount;i++)
		dc.Ellipse(m_nsampleStore[i][1]-10,m_nsampleStore[i][2]-10,m_nsampleStore[i][1]+10,m_nsampleStore[i][2]+10);
	dc.SelectObject(oldpen);
	str.Format("Sample No:%d  ",m_nsampleCount);
	dc.TextOut(0,20,str);
}

void CSortView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_ndrawFlag==0)
	{
		m_nsampleStore[m_nsampleCount][0]=0;
		m_nsampleStore[m_nsampleCount][1]=point.x;
		m_nsampleStore[m_nsampleCount][2]=point.y;
		m_nsampleCount++;
		m_ndrawFlag=1;
	}
	
	InvalidateRect(CRect(point.x,point.y,point.x+1,point.y+1));
	
	CView::OnLButtonDown(nFlags, point);
}

void CSortView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_ptMouse=point;
	InvalidateRect(CRect(0,0,100,20));

	CView::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

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