📄 antclustingview.cpp
字号:
// AntClustingView.cpp : implementation of the CAntClustingView class
//
#include "stdafx.h"
#include "AntClusting.h"
#include "time.h"
#include "AntClustingDoc.h"
#include "AntClustingView.h"
#include "ArrayData.h"
#include "AntClusterAlogrithm.h"
#include "KmeansAlg.h"
#include "RDDlg.h"
#include "ParaDlg.h"
#include "InputCu.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//extern DataObject dataObj[DATANUMBER];
extern CAntClusterAlogrithm alogrithm;
extern CArrayData *m_pAd;
extern DataObject *dataObj;
/////////////////////////////////////////////////////////////////////////////
// CAntClustingView
IMPLEMENT_DYNCREATE(CAntClustingView, CScrollView)
BEGIN_MESSAGE_MAP(CAntClustingView, CScrollView)
//{{AFX_MSG_MAP(CAntClustingView)
ON_COMMAND(ID_PARAMETER, OnParameter)
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_COMMAND(IDD_MENU_READDATA, OnMenuReaddata)
ON_COMMAND(ID_CLOSE, OnClose)
ON_COMMAND(ID_ORI_KMEANS, OnOriKmeans)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAntClustingView construction/destruction
CAntClustingView::CAntClustingView()
{
// TODO: add construction code here
m_nViewDataNum=1;
m_nViewPropNum=0;
m_pOriDataObj=NULL;
posChangeDataNum = 0;
m_bStartDraw=false;
}
CAntClustingView::~CAntClustingView()
{
}
BOOL CAntClustingView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CAntClustingView drawing
void CAntClustingView::OnDraw(CDC* pDC)
{ // TODO: add draw code for native data here
if(m_bStartDraw)
{
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);//GetDeviceCaps(LOGPIXELSX)和GetDeviceCaps(LOGPIXELSY)代表每逻辑英寸对应的水平像素点数
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
CRect rect;
GetClientRect(rect);
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowOrg(0,0);
pDC->SetWindowExt(alogrithm.m_nXSize*120,alogrithm.m_nYSize*120);
pDC->SetViewportExt(rect.right, rect.bottom);
//pDC->SetViewportExt(xLogPixPerInch, yLogPixPerInch);
/* pDC->SetViewportOrg(0,0); 当滚动视图时,windows自动调用onDraw函数重绘屏幕
若此处加上这条语句,则重新把当前客户区的原点作为
视口的原点,重绘图象会与原图象重迭难以辨认,所以不
可以调动此函数,视口原点的设置由windows在初使化时
设置一次即可,默认原点为(0,0)
*/
// 取当前字体大小
CFont *curFont = pDC->GetCurrentFont();
LOGFONT curLogFont;
LOGFONT newLogFont;
curFont->GetLogFont( &curLogFont );
long NewFontWidth = curLogFont.lfWidth;
long NewFontHeight = curLogFont.lfHeight;
newLogFont = curLogFont;
//计算新的字体大小--缩小一倍
newLogFont.lfWidth =(long)((float)NewFontWidth/50.0
* ((float)xLogPixPerInch / 72.0));
newLogFont.lfHeight =(long)((float)NewFontHeight/50.0
* ((float)yLogPixPerInch / 72.0));
//创建并设置新的字体,保留以前的字体
CFont newFont, *pnewFont;
pnewFont=&newFont;
CFont *oldFont;
newFont.CreateFontIndirect(&newLogFont);
oldFont = pDC->SelectObject(pnewFont);
///画出各类中元素
CString ShowStr;
int line=0;
int linewide=300;
ShowStr.Format(_T("数据移动次数: %d"), posChangeDataNum);
pDC->TextOut(0,line,ShowStr);
line++;
ShowStr.Format(_T("类的总数: %d"), classNo);
pDC->TextOut(0,line*linewide,ShowStr);
line++;
for(int m=0;m<=classNo;m++)
{
CString sTemp;
sTemp.Format("classNo: %d",m);
pDC->TextOut(0,line*linewide,sTemp);
line++;
int count = 0;
for(int n=0;n<m_nViewDataNum;n++)
{
ShowStr.Empty();
if((dataObj+n)->clusterNo==m)
{
ShowStr.Format("dataPosition: %d ",n);
sTemp.Format("%f ",(dataObj+n)->x);
ShowStr+=sTemp;
sTemp.Format("%f ",(dataObj+n)->y);
ShowStr+=sTemp;
for(int i=0;i<m_nViewPropNum;i++)
{sTemp.Format("%f ",*((dataObj+n)->m_pfa+i));
ShowStr+=sTemp;}
pDC->TextOut(0,line*linewide,ShowStr);
line++;
count++;
}
}
ShowStr.Format("此类中的数据个数: %d",count);
pDC->TextOut(0,line*linewide,ShowStr);
line++;
}
line+=2;
ShowStr= "初始的数据分布:";
pDC->TextOut(0,line*linewide,ShowStr);
line++;
//////////////////////////////////////////
//最后不要忘记将字体还原,这一句是必需的
pnewFont=pDC->SelectObject(oldFont);
int excursion=40;
/////画框
pDC->Rectangle(excursion,line*linewide,alogrithm.m_nXSize*100+excursion,line*linewide+alogrithm.m_nYSize*100);
////画原始数据分布
CBrush redBrush(RGB(255,0,0));
/*
CBrush greenBrush(RGB(0,255,0));
CBrush blueBrush(RGB(0,0,255));
CBrush* pOldBrush = pDC->SelectObject(&redBrush);
int r=18;
for(int i=0;i<150;i++)
{
pDC->Ellipse((int)(m_pOriDataObj+i)->x*100-r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide-r,
(int)(m_pOriDataObj+i)->x*100+r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide+r);
}
pDC->SelectObject(&greenBrush);
for(i=50;i<100;i++)
{
pDC->Ellipse((int)(m_pOriDataObj+i)->x*100-r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide-r,
(int)(m_pOriDataObj+i)->x*100+r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide+r);
}
pDC->SelectObject(&blueBrush);
for(i=100;i<150;i++)
{
pDC->Ellipse((int)(m_pOriDataObj+i)->x*100-r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide-r,
(int)(m_pOriDataObj+i)->x*100+r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide+r);
}
// */
//////////////////////////////////////////
///*
int r=18;
CBrush* pOldBrush = pDC->SelectObject(&redBrush);
for(int i=0;i<m_nViewDataNum;i++)
{
pDC->Ellipse((int)(m_pOriDataObj+i)->x*100-r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide-r,
(int)(m_pOriDataObj+i)->x*100+r+excursion,(int)(m_pOriDataObj+i)->y*100+line*linewide+r);
}
// */
//恢复画刷
pDC->SelectObject(pOldBrush);
///*
/*
line+=(alogrithm.m_nYSize*100)/linewide;
ShowStr= "数据聚类结果:";
line++;
oldFont= pDC->SelectObject(pnewFont );
pDC->TextOut(0,line*linewide,ShowStr);
pnewFont=pDC->SelectObject(oldFont);
line+=2;
/////画框
pDC->Rectangle(excursion,line*linewide,alogrithm.m_nXSize*100+excursion,line*linewide+alogrithm.m_nYSize*100);
///画聚类后数据分布
pDC->SelectObject(&redBrush);
for(i=0;i<50;i++)
{
pDC->Ellipse((int)(dataObj+i)->x*100-r+excursion,(int)(dataObj+i)->y*100+line*linewide-r,
(int)(dataObj+i)->x*100+r+excursion,(int)(dataObj+i)->y*100+line*linewide+r);
}
pDC->SelectObject(&greenBrush);
for(i=50;i<100;i++)
{
pDC->Ellipse((int)(dataObj+i)->x*100-r+excursion,(int)(dataObj+i)->y*100+line*linewide-r,
(int)(dataObj+i)->x*100+r+excursion,(int)(dataObj+i)->y*100+line*linewide+r);
}
pDC->SelectObject(&blueBrush);
for(i=100;i<150;i++)
{
pDC->Ellipse((int)(dataObj+i)->x*100-r+excursion,(int)(dataObj+i)->y*100+line*linewide-r,
(int)(dataObj+i)->x*100+r+excursion,(int)(dataObj+i)->y*100+line*linewide+r);
}
pDC->SelectObject(pOldBrush);
//*/
line+=(alogrithm.m_nYSize*100)/linewide;
ShowStr= "数据聚类结果的分类显示:";
line++;
oldFont= pDC->SelectObject(pnewFont );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -