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