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

📄 isodataview.cpp

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

#include "stdafx.h"
#include "ISODATA.h"
#include "isodata1.h"
#include "math.h"
#include "ISODATADoc.h"
#include "ISODATAView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CISODATAView


IMPLEMENT_DYNCREATE(CISODATAView, CView)

BEGIN_MESSAGE_MAP(CISODATAView, CView)
	//{{AFX_MSG_MAP(CISODATAView)
	ON_COMMAND(ID_iso, Oniso)
	ON_BN_CLICKED(IDC_ok, Onok)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CISODATAView construction/destruction

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 mult(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 CISODATAView::comp(double a,double b)
{
 if(a>b)
	{
		sm=a;
		signal=1;
	}
	else
	{
		sm=b;
		signal=0;
	}
}

void CISODATAView::xiuzheng()
{
	for(int i=0;i<c;i++)//xiuzheng
		{
			
			if(n[i]<cn)
			{
				c--;
				for(int j=i;j<c;j++)
				{
					mid[j]=mid[j+1];
				}
				
			}

            else
			{
				 mid[i]=mult(1/n[i],add(gg[i],n[i]));
			}
		}
}

void CISODATAView::fenlie()
{
	int j=0;
	for(int i=0;i<c;i++)
	{
		comp(sc[i].x,sc[i].y);
		if(sm>cs)
		{
			if(c<=2/k||(sd[i]<total&&n[i]>2*(cn+1)))
			{
				if(signal)
				{
					mid[i].x+=0.5*sm;
					mid[c+j].x-=0.5*sm;
				}
				else
				{
					mid[i].y+=0.5*sm;
					mid[c+j].y-=0.5*sm;
				}
				j++;
			}
		}
	}
	c+=j;
}
void CISODATAView::hebing()
{
	for(int i=0;i<c;i++)
				{
					double temp=dist(mid[i],mid[i+1]);
					if(temp<cc)
					{
						c--;
						mid[i]=mult((1/(n[i]+n[i+1])),(mult(n[i],mid[i])+mult(n[i+1],mid[i+1])));
						for(int j=i+1;j<c;j++)
						{
							mid[j]=mid[j+1];
						}
					}
				}
}
CISODATAView::CISODATAView()
{
  
  // TODO: add construction code here

}

CISODATAView::~CISODATAView()
{
}

BOOL CISODATAView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CISODATAView drawing

void CISODATAView::OnDraw(CDC* pDC)
{
	CISODATADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CISODATAView printing

BOOL CISODATAView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CISODATAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CISODATAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CISODATAView diagnostics

#ifdef _DEBUG
void CISODATAView::AssertValid() const
{
	CView::AssertValid();
}

void CISODATAView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CISODATADoc* CISODATAView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CISODATADoc)));
	return (CISODATADoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CISODATAView message handlers

void CISODATAView::Oniso() 
{
	Cisodata dlg;
    dlg.DoModal();
           // TODO: Add your command handler code here
	
}

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


	    xiuzheng();


		for(int i3=0;i3<c;i3++)//zongti juli he fangcha 
		{
			double sum=0,sum1=0,sum2=0;
			for(int j3=0;j3<n[i3];j3++)
			{
				sum+=dist(mid[i3],gg[i3][j3]);
				sum1+=dd(mid[i3].x,gg[i3][j3].x);
                sum2+=dd(mid[i3].y,gg[i3][j3].y);
			}
			sd[i3]=(1/n[i3])*sum;
			sc[i3].x =sqrt((1/n[i3])*sum1);
            sc[i3].y =sqrt((1/n[i3])*sum2);
			total+=sd[i3]*n[i3];
			count+=n[i3];

		}
		
		total=total/count;

		if(l==0)
			break;


	   fenlie();
	


		if(c>=2*k||(k+1)%2==0)
		{
				hebing();
		}
	}
				

}	    // TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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