📄 sortview.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 + -