📄 kmaview.cpp
字号:
// KMAView.cpp : implementation of the CKMAView class
//
#include "stdafx.h"
#include "KMA.h"
#include <iostream>
#include <set>
#include "KMADoc.h"
#include "KMAView.h"
#include "Setting.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
float Irisdata[150][4];
std::set<int> intSet;
std::set<int> intSet1;
std::set<int> intSet2;
std::set<int> intSet3;
std::set<int> intSet4;
std::set<int>::iterator iter;
std::set<int>::iterator iter1;
std::set<int>::iterator iter2;
std::set<int>::iterator iter3;
std::set<int>::iterator iter4;
int stepx=0,stepy=0;
CSetting dlgsetting;
float center1_1=0.0,center1_2=0.0,center1_3=0.0,center1_4=0.0;
float center2_1=0.0,center2_2=0.0,center2_3=0.0,center2_4=0.0;
float center3_1=0.0,center3_2=0.0,center3_3=0.0,center3_4=0.0;
float center4_1=0.0,center4_2=0.0,center4_3=0.0,center4_4=0.0;
int paintstep=0;
BOOL flag=false;
/////////////////////////////////////////////////////////////////////////////
// CKMAView
IMPLEMENT_DYNCREATE(CKMAView, CView)
BEGIN_MESSAGE_MAP(CKMAView, CView)
//{{AFX_MSG_MAP(CKMAView)
ON_COMMAND(IDM_SETTING, OnSetting)
ON_COMMAND(IDM_READFILE, OnReadfile)
ON_WM_TIMER()
ON_WM_PAINT()
ON_WM_VSCROLL()
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CKMAView construction/destruction
CKMAView::CKMAView()
{
// TODO: add construction code here
}
CKMAView::~CKMAView()
{
}
BOOL CKMAView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CKMAView drawing
void CKMAView::OnDraw(CDC* pDC)
{
CKMADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CKMAView printing
BOOL CKMAView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CKMAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CKMAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CKMAView diagnostics
#ifdef _DEBUG
void CKMAView::AssertValid() const
{
CView::AssertValid();
}
void CKMAView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CKMADoc* CKMAView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CKMADoc)));
return (CKMADoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CKMAView message handlers
void CKMAView::OnSetting()
{
dlgsetting.DoModal();
UpdateData(false);
if(dlgsetting.m_category==3)
{
intSet1.insert(dlgsetting.m_seed1);
intSet2.insert(dlgsetting.m_seed2);
intSet3.insert(dlgsetting.m_seed3);
}
if(dlgsetting.m_category==4)
{
intSet1.insert(dlgsetting.m_seed1);
intSet2.insert(dlgsetting.m_seed2);
intSet3.insert(dlgsetting.m_seed3);
intSet4.insert(dlgsetting.m_seed4);
}
SetTimer(1,2000,NULL);
}
void CKMAView::OnReadfile()
{
static char szFilter[] = "Text Files (*.txt)|*.txt||";
CFileDialog dlg(TRUE,"txt",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
CString filename;
float sdata;
dlg.m_ofn.lpstrTitle="载入数据";
char s[100];
if(dlg.DoModal() == IDOK)
{
filename = dlg.GetPathName();
FILE* fp;
fp=fopen(filename,"r");
int i=0, j=0;
while(!feof(fp))
{
fscanf(fp, "%s", s);
sdata=atof(s);
Irisdata[i][j]=sdata;
if(j++==3)
{
i++;
j=0;
}
}
}
}
void CKMAView::OnTimer(UINT nIDEvent)
{
// center1_1=0.0,center1_2=0.0,center1_3=0.0,center1_4=0.0;
// center2_1=0.0,center2_2=0.0,center2_3=0.0,center2_4=0.0;
// center3_1=0.0,center3_2=0.0,center3_3=0.0,center3_4=0.0;
// center4_1=0.0,center4_2=0.0,center4_3=0.0,center4_4=0.0;
if(!flag)
{
if(dlgsetting.m_category==3)
{
center1_1=Irisdata[dlgsetting.m_seed1-1][0];
center1_2=Irisdata[dlgsetting.m_seed1-1][1];
center1_3=Irisdata[dlgsetting.m_seed1-1][2];
center1_4=Irisdata[dlgsetting.m_seed1-1][3];
center2_1=Irisdata[dlgsetting.m_seed2-1][0];
center2_2=Irisdata[dlgsetting.m_seed2-1][1];
center2_3=Irisdata[dlgsetting.m_seed2-1][2];
center2_4=Irisdata[dlgsetting.m_seed2-1][3];
center3_1=Irisdata[dlgsetting.m_seed3-1][0];
center3_2=Irisdata[dlgsetting.m_seed3-1][1];
center3_3=Irisdata[dlgsetting.m_seed3-1][2];
center3_4=Irisdata[dlgsetting.m_seed3-1][3];
int i,j;
for(i=0;i<150;i++)
{float m1_1=Irisdata[i][0]-Irisdata[dlgsetting.m_seed1-1][0];
float m2_1=Irisdata[i][1]-Irisdata[dlgsetting.m_seed1-1][1];
float m3_1=Irisdata[i][2]-Irisdata[dlgsetting.m_seed1-1][2];
float m4_1=Irisdata[i][3]-Irisdata[dlgsetting.m_seed1-1][3];
float m1_2=Irisdata[i][0]-Irisdata[dlgsetting.m_seed2-1][0];
float m2_2=Irisdata[i][1]-Irisdata[dlgsetting.m_seed2-1][1];
float m3_2=Irisdata[i][2]-Irisdata[dlgsetting.m_seed2-1][2];
float m4_2=Irisdata[i][3]-Irisdata[dlgsetting.m_seed2-1][3];
float m1_3=Irisdata[i][0]-Irisdata[dlgsetting.m_seed3-1][0];
float m2_3=Irisdata[i][1]-Irisdata[dlgsetting.m_seed3-1][1];
float m3_3=Irisdata[i][2]-Irisdata[dlgsetting.m_seed3-1][2];
float m4_3=Irisdata[i][3]-Irisdata[dlgsetting.m_seed3-1][3];
float x=sqrt(m1_1*m1_1+m2_1*m2_1+m3_1*m3_1+m4_1*m4_1);
float y=sqrt(m1_2*m1_2+m2_2*m2_2+m3_2*m3_2+m4_2*m4_2);
float z=sqrt(m1_3*m1_3+m2_3*m2_3+m3_3*m3_3+m4_3*m4_3);
if(x<=y&&x<=z)intSet1.insert(i+1);//存在集合中的是元素的下标
else if(y<x&&y<z)intSet2.insert(i+1);
else intSet3.insert(i+1);
}
flag=true;
}
}
//计算新的聚类中心
float cen1_1=0.0,cen1_2=0.0,cen1_3=0.0,cen1_4=0.0;
float cen2_1=0.0,cen2_2=0.0,cen2_3=0.0,cen2_4=0.0;
float cen3_1=0.0,cen3_2=0.0,cen3_3=0.0,cen3_4=0.0;
float cen4_1=0.0,cen4_2=0.0,cen4_3=0.0,cen4_4=0.0;
for(iter1=intSet1.begin();iter1!=intSet1.end();iter1++)
{
cen1_1+=Irisdata[*iter1-1][0];
cen1_2+=Irisdata[*iter1-1][1];
cen1_3+=Irisdata[*iter1-1][2];
cen1_4+=Irisdata[*iter1-1][3];
}
float size_set1=intSet1.size();
cen1_1/=size_set1;
cen1_2/=size_set1;
cen1_3/=size_set1;
cen1_4/=size_set1;
///////////////////////////////////////////////////////
// float cen2_1=0.0,cen2_2=0.0,cen2_3=0.0,cen2_4=0.0;
for(iter2=intSet2.begin();iter2!=intSet2.end();iter2++)
{
cen2_1+=Irisdata[*iter2-1][0];
cen2_2+=Irisdata[*iter2-1][1];
cen2_3+=Irisdata[*iter2-1][2];
cen2_4+=Irisdata[*iter2-1][3];
}
float size_set2=intSet2.size();
cen2_1/=size_set2;
cen2_2/=size_set2;
cen2_3/=size_set2;
cen2_4/=size_set2;
//////////////////////////////////////////////////
///////////////////////////////////////////////////////
// float cen3_1=0.0,cen3_2=0.0,cen3_3=0.0,cen3_4=0.0;
for(iter3=intSet3.begin();iter3!=intSet3.end();iter3++)
{
cen3_1+=Irisdata[*iter3-1][0];
cen3_2+=Irisdata[*iter3-1][1];
cen3_3+=Irisdata[*iter3-1][2];
cen3_4+=Irisdata[*iter3-1][3];
}
float size_set3=intSet3.size();
cen3_1/=size_set3;
cen3_2/=size_set3;
cen3_3/=size_set3;
cen3_4/=size_set3;
//////////////////////////////////////////////////
// center1_1=0.0,center1_2=0.0,center1_3=0.0,center1_4=0.0;
// center2_1=0.0,center2_2=0.0,center2_3=0.0,center2_4=0.0;
// center3_1=0.0,center3_2=0.0,center3_3=0.0,center3_4=0.0;
// center4_1=0.0,center4_2=0.0,center4_3=0.0,center4_4=0.0;
// float cen1_1=0.0,cen1_2=0.0,cen1_3=0.0,cen1_4=0.0;
// float cen2_1=0.0,cen2_2=0.0,cen2_3=0.0,cen2_4=0.0;
//// float cen3_1=0.0,cen3_2=0.0,cen3_3=0.0,cen3_4=0.0;
// float cen4_1=0.0,cen4_2=0.0,cen4_3=0.0,cen4_4=0.0;
if(cen1_1!=center1_1||cen1_2!=center1_2||cen1_3!=center1_3||cen1_4!=center1_4||
cen2_1!=center2_1||cen2_2!=center2_2||cen2_3!=center2_3||cen2_4!=center2_4||
cen3_1!=center3_1||cen3_2!=center3_2||cen3_3!=center3_3||cen3_4!=center3_4)
{
intSet1.clear();
intSet2.clear();
intSet3.clear();
center1_1=cen1_1;
center1_2=cen1_2;
center1_3=cen1_3;
center1_4=cen1_4;
center2_1=cen2_1;
center2_2=cen2_2;
center2_3=cen2_3;
center2_4=cen2_4;
center3_1=cen3_1;
center3_2=cen3_2;
center3_3=cen3_3;
center3_4=cen3_4;
for(int i=0;i<150;i++)
{float m1_1=Irisdata[i][0]-center1_1;
float m2_1=Irisdata[i][1]-center1_2;
float m3_1=Irisdata[i][2]-center1_3;
float m4_1=Irisdata[i][3]-center1_4;
float m1_2=Irisdata[i][0]-center2_1;
float m2_2=Irisdata[i][1]-center2_2;
float m3_2=Irisdata[i][2]-center2_3;
float m4_2=Irisdata[i][3]-center2_4;
float m1_3=Irisdata[i][0]-center3_1;
float m2_3=Irisdata[i][1]-center3_2;
float m3_3=Irisdata[i][2]-center3_3;
float m4_3=Irisdata[i][3]-center3_4;
float x=sqrt(m1_1*m1_1+m2_1*m2_1+m3_1*m3_1+m4_1*m4_1);
float y=sqrt(m1_2*m1_2+m2_2*m2_2+m3_2*m3_2+m4_2*m4_2);
float z=sqrt(m1_3*m1_3+m2_3*m2_3+m3_3*m3_3+m4_3*m4_3);
if(x<=y&&x<=z)intSet1.insert(i+1);//存在集合中的是元素的下标
else if(y<x&&y<z)intSet2.insert(i+1);
else intSet3.insert(i+1);
}
}
else KillTimer(1);
paintstep++;
Invalidate();
CView::OnTimer(nIDEvent);
}
void CKMAView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CString str;
str.Format("%d",paintstep);
CString msgstr;
msgstr="第";
msgstr+=str;
msgstr+="次聚类";
dc.TextOut(400,5,msgstr);
if(dlgsetting.m_category==3)
{
for(iter1=intSet1.begin();iter1!=intSet1.end();iter1++)
{
dc.TextOut(10,10,"聚类中心1");
stepy++;
str.Format("%2.1f",Irisdata[*iter1-1][0]);
dc.TextOut(20+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter1-1][1]);
dc.TextOut(50+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter1-1][2]);
dc.TextOut(80+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter1-1][3]);
dc.TextOut(110+stepx*20,10+stepy*7,str);
stepy++;
}
stepy=0;
for(iter2=intSet2.begin();iter2!=intSet2.end();iter2++)
{
dc.TextOut(150,10,"聚类中心2");
stepy++;
str.Format("%2.1f",Irisdata[*iter2-1][0]);
dc.TextOut(150+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter2-1][1]);
dc.TextOut(180+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter2-1][2]);
dc.TextOut(210+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter2-1][3]);
dc.TextOut(240+stepx*20,10+stepy*7,str);
stepy++;
}
stepy=0;
for(iter3=intSet3.begin();iter3!=intSet3.end();iter3++)
{
dc.TextOut(280,10,"聚类中心3");
stepy++;
str.Format("%2.1f",Irisdata[*iter3-1][0]);
dc.TextOut(280+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter3-1][1]);
dc.TextOut(310+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter3-1][2]);
dc.TextOut(340+stepx*20,10+stepy*7,str);
str.Format("%2.1f",Irisdata[*iter3-1][3]);
dc.TextOut(370+stepx*20,10+stepy*7,str);
stepy++;
}
stepy=0;
}
}
void CKMAView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
CView::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CKMAView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100; //设置为需要的大小,如果大于窗口坐标数,就会出现scrllbar;
SetScrollSizes(MM_TEXT, sizeTotal);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -