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

📄 kmaview.cpp

📁 用VC编写的K均值聚类算法的源代码
💻 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 + -