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

📄 isodatadlg.cpp

📁 实现了模式识别中的利用isodata算法进行分类
💻 CPP
字号:
// isodataDlg.cpp : implementation file
//

#include "stdafx.h"
#include "isodata.h"
#include "isodataDlg.h"
#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIsodataDlg dialog

CIsodataDlg::CIsodataDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CIsodataDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CIsodataDlg)
	m_11 = 0.0;
	m_12 = 0.0;
	m_13 = "";
	m_21 = 1.0;
	m_22 = 1.0;
	m_23 = "";
	m_31 = 2.0;
	m_32 = 2.0;
	m_33 = "";
	m_41 = 5.0;
	m_42 = 3.0;
	m_43 = "";
	m_51 = 6.0;
	m_52 = 3.0;
	m_53 = "";
	m_61 = 5.0;
	m_62 = 4.0;
	m_63 = "";
	m_71 = 6.0;
	m_72 = 4.0;
	m_73 = "";
	m_81 = 7.0;
	m_82 = 5.0;
	m_83 = "";
	
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CIsodataDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CIsodataDlg)
	DDX_Text(pDX, IDC_11, m_11);
	DDX_Text(pDX, IDC_12, m_12);
	DDX_Text(pDX, IDC_13, m_13);
	DDX_Text(pDX, IDC_21, m_21);
	DDX_Text(pDX, IDC_22, m_22);
	DDX_Text(pDX, IDC_23, m_23);
	DDX_Text(pDX, IDC_31, m_31);
	DDX_Text(pDX, IDC_32, m_32);
	DDX_Text(pDX, IDC_33, m_33);
	DDX_Text(pDX, IDC_41, m_41);
	DDX_Text(pDX, IDC_42, m_42);
	DDX_Text(pDX, IDC_43, m_43);
	DDX_Text(pDX, IDC_51, m_51);
	DDX_Text(pDX, IDC_52, m_52);
	DDX_Text(pDX, IDC_53, m_53);
	DDX_Text(pDX, IDC_61, m_61);
	DDX_Text(pDX, IDC_62, m_62);
	DDX_Text(pDX, IDC_63, m_63);
	DDX_Text(pDX, IDC_71, m_71);
	DDX_Text(pDX, IDC_72, m_72);
	DDX_Text(pDX, IDC_73, m_73);
	DDX_Text(pDX, IDC_81, m_81);
	DDX_Text(pDX, IDC_82, m_82);
	DDX_Text(pDX, IDC_83, m_83);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CIsodataDlg, CDialog)
	//{{AFX_MSG_MAP(CIsodataDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, Onclassdivide)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIsodataDlg message handlers

BOOL CIsodataDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
   

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CIsodataDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CIsodataDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CIsodataDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}




vector add(vector a[],int n)
{
	vector temp;
	for(int i=0;i<n;i++)
	{
		temp.x+=a[i].x;
		temp.y+=a[i].y;
	}
	return temp;
}
vector operator +(vector a,vector b)
{
    vector temp;
	temp.x=a.x+b.x;
	temp.y=a.y+b.y;

	return temp;
}
vector operator *(double a,vector b)
{
	vector temp;
	temp.x=a*b.x;
	temp.y=a*b.y;
	return temp;
}
double dist(vector a,vector b)
{
	return (sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
double dd(double a,double b)
{
	return ((a-b)*(a-b));
}

void CIsodataDlg::comp(double a,double b)
{
 if(a>b)
	{
		sm=a;
		signal=1;
	}
	else
	{
		sm=b;
		signal=0;
	}
}
void CIsodataDlg::divide()
{
	 int j=0;
	 for(int i=0;i<c;i++)
	 {
		comp(sc[i].x,sc[i].y);
		if(sm>cs)
		{
			if(c<=k/2||(sd[i]>total&&n[i]>2*(cn+1)))
			{
				
				if(signal)
				{
					mid[c+j].x=mid[i].x-0.5*sm;
                    mid[c+j].y=mid[i].y;
					mid[i].x+=0.5*sm;
					
				}
				else
				{	
					mid[c+j].y=mid[i].y-0.5*sm;
                    mid[c+j].x=mid[i].x;
					mid[i].y+=0.5*sm;
				
				}
				j++;
				

			}
		}
	}
    c+=j;
}



void CIsodataDlg::group()
{
    int count1=0;
    double distance[10];
	vector xys[10];
	for(int i=0;i<c-1;i++)
	{
		 for(int j=i+1;j<c;j++)
		 {
		       double classdist=dist(mid[i],mid[j]);
			   if(classdist<cc)			  
			   {
				  
				  distance[count1]=classdist;
				  xys[count1].x=i;
				  xys[count1].y=j;
				  for(int p=0;p<=count1;p++)
				  {
					  double middle;
					  vector tem;
					  if(distance[p]>distance[p+1])
					  { 
						  middle=distance[p];
						  tem=xys[p];
						  distance[p]=distance[p+1];
						  xys[p]=xys[p+1];
						  distance[p+1]=middle;
						  xys[p+1]=tem;
					  }	
				  }
				count1++;
			  }
	
		 }
		 
	}  
	int sig[10]={1,1,1,1,1,1,1,1,1,1};
	int delflag[10]={1,1,1,1,1,1,1,1,1,1};
    int a;
	int b;
	for( int q=0;q<count1;q++)
	{   
		a=xys[q].x;
		b=xys[q].y;
		if(sig[a]!=0&&sig[b]!=0)
		{
		mid[a]=(1.0/(n[a]+n[b]))*(n[a]*mid[a]+n[b]*mid[b]);
		delflag[b]=0;
		}
        
   	}
	for( int ll=0;ll<count1;ll++)
	{
		if(delflag[ll]==0)
		{
		mid[ll]=mid[c-1-ll];
	    delflag[ll]=delflag[c-1-ll];
		c--;
		ll--;
		}
	}
	
}


void CIsodataDlg::Onclassdivide() 
{
     bool flag1;
	 flag1=UpdateData(true);
	 
	 if(flag1)
	 {
		    
			int count=0;
			total=0;
			ss[0].x=m_11;ss[0].y=m_12; ss[1].x=m_21;ss[1].y=m_22;  ss[2].x=m_31;ss[2].y=m_32; ss[3].x=m_41;ss[3].y=m_42;
			ss[4].x=m_51;ss[4].y=m_52; ss[5].x=m_61;ss[5].y=m_62;  ss[6].x=m_71;ss[6].y=m_72; ss[7].x=m_81;ss[7].y=m_82;
			c=1;
			mid[0]=ss[0];
			k=4;
			cs=1;
			cc=1;
			cn=1;
			l=5;
			while(l--)
		{
		
				    for (int kk=0;kk<c;kk++)
					{
						n[kk]=0;
					}
					for(int i=0;i<8;i++)
					{
						int mark=0;
						double distance=dist(mid[0],ss[i]);
						for(int j=0;j<c;j++)
						{
							if(distance>dist(mid[j],ss[i]))
							{
								mark=j;
							}
						}
						
						gg[mark][n[mark]]=ss[i];
						n[mark]++;
						lei[i]=mark+1;
					}
		
               
				   if(l==0)
					  break;
					  
				   for(int i1=0;i1<c;i1++)//xiuzheng
				   {
					
						if(n[i1]<cn)
						{
							
							mid[i1]=mid[c-1];
							n[i1]=n[c-1];
							for(int j1=0;j1<n[c-1];j1++)
							{
								gg[i1][j1]=gg[c-1][j1];
							}
							i1--;
							c--;
							
							
						}

						else
						{
							 mid[i1]=(1.0/n[i1])*add(gg[i1],n[i1]);
							 double sum=0,sum1=0,sum2=0;
							 for(int j1=0;j1<n[i1];j1++)
							 {
								 sum+=dist(mid[i1],gg[i1][j1]);
								 sum1+=dd(mid[i1].x,gg[i1][j1].x);
								 sum2+=dd(mid[i1].y,gg[i1][j1].y);
							 }
								
								sd[i1]=(1.0/n[i1])*sum;
								sc[i1].x =sqrt((1.0/n[i1])*sum1);
								sc[i1].y =sqrt((1.0/n[i1])*sum2);
								total+=sd[i1]*n[i1];
								count+=n[i1];
	                          
						}
				   }
						total=total/count;
		
				divide();	
				if(c>=2*k||k%2==0)
				{
					group();
				}

		}
			m_13.Format("第%d类",lei[0]);m_23.Format("第%d类",lei[1]);m_33.Format("第%d类",lei[2]);m_43.Format("第%d类",lei[3]);
			m_53.Format("第%d类",lei[4]);m_63.Format("第%d类",lei[5]);m_73.Format("第%d类",lei[6]);m_83.Format("第%d类",lei[7]);
            UpdateData(false) ;  
   
				
	 }
	
	
}

⌨️ 快捷键说明

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