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

📄 isodataview.cpp

📁 模式识别二维链表实现isodata算法 早期试验
💻 CPP
字号:
// ISODATAView.cpp : implementation of the CISODATAView class
//

#include "stdafx.h"
#include "ISODATA.h"

#include "ISODATADoc.h"
#include "ISODATAView.h"
#include "ParaSetDlg.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_WM_LBUTTONUP()
	ON_COMMAND(ID_PARASET, OnParaset)
	ON_COMMAND(ID_BEGINCLUSTER, OnBegincluster)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

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

CISODATAView::CISODATAView()
{
	// TODO: add construction code here
	c=5;//预期的类数
	Nc=10;//初始聚类中心个数
	Thn=8;//每一类中允许的最小模式数目
	Ths=5;//类内各个分量分布的标准差上限
	ThD=200;//两类中心之间的最小距离下限
	L=2;//在每次迭代中可以合并的类的最多对数
	I=20;//允许的最多迭代次数
	k=0.5;//类分裂时用的系数k
	PatNum=50;//设定模式的个数
	PatDim=2;//设定模式的维数

	pInput=NULL;
	PatInStart=0;//是否可以开始数据输入
	ClusCanBegin=0;//是否可以开始聚类

	count=0;//鼠标输入数据的次数
//	pDC=GetDC();


}

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 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::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(PatInStart==0||pInput==NULL)
		return;
	
	CDC *pDC;

	pDC=GetDC();

	
	if(PatInStart==1)
	{
		pInput[count]=(double)point.x;	
		pInput[count+1]=(double)point.y;
		CString stringx,stringy,stringxy;
		stringx.Format("%d",point.x);
		stringy.Format("%d",point.y);
		stringxy="("+stringx+","+stringy+")";

		
		pDC->TextOut(point.x,point.y,stringxy);

	
		count+=2;
		if(count==PatNum*PatDim)
		{
			
			PatInStart=0;
			MessageBox("输入结束");
			ClusCanBegin=1;
			return;
		}
	}
	
		ReleaseDC(pDC);


	
	CView::OnLButtonUp(nFlags, point);
}

void CISODATAView::OnParaset() 
{
	// TODO: Add your command handler code here
//	MessageBox((CString)1199);

	CParaSetDlg parasetdlg;
	parasetdlg.m_c=c;//预期的类数
	parasetdlg.m_Nc=Nc;//初始聚类中心个数
	parasetdlg.m_Thn=Thn;//每一类中允许的最小模式数目
	parasetdlg.m_Ths=Ths;//类内各个分量分布的标准差上限
	parasetdlg.m_ThD=ThD;//两类中心之间的最小距离下限
	parasetdlg.m_L=L;//在每次迭代中可以合并的类的最多对数
	parasetdlg.m_I=I;//允许的最多迭代次数
	parasetdlg.m_k=k;//类分裂时用的系数k
	parasetdlg.m_PatNum=PatNum;//设定模式的个数
	parasetdlg.m_PatDim=PatDim;//设定模式的维数

	if(parasetdlg.DoModal()==IDOK)
	{
	isodata.c=parasetdlg.m_c;//预期的类数
	isodata.Nc=parasetdlg.m_Nc;//初始聚类中心个数
	isodata.Thn=parasetdlg.m_Thn;//每一类中允许的最小模式数目
	isodata.Ths=parasetdlg.m_Ths;//类内各个分量分布的标准差上限
	isodata.ThD=parasetdlg.m_ThD;//两类中心之间的最小距离下限
	isodata.L=parasetdlg.m_L;//在每次迭代中可以合并的类的最多对数
	isodata.I=parasetdlg.m_I;//允许的最多迭代次数
	isodata.PatNum=parasetdlg.m_PatNum;//模式的个数
	isodata.PatDim=parasetdlg.m_PatDim;//模式的维数
	isodata.k=parasetdlg.m_k;//类分裂时用的系数k
	
	
	c=parasetdlg.m_c;//预期的类数
	Nc=parasetdlg.m_Nc;//初始聚类中心个数
	Thn=parasetdlg.m_Thn;//每一类中允许的最小模式数目
	Ths=parasetdlg.m_Ths;//类内各个分量分布的标准差上限
	ThD=parasetdlg.m_ThD;//两类中心之间的最小距离下限
	L=parasetdlg.m_L;//在每次迭代中可以合并的类的最多对数
	I=parasetdlg.m_I;//允许的最多迭代次数
	PatNum=parasetdlg.m_PatNum;//模式的个数
	PatDim=parasetdlg.m_PatDim;//模式的维数
	k=parasetdlg.m_k;//类分裂时用的系数k
	
	}


//	CString show;
//	show.Format("%f",isodata.ThD);
	MessageBox("可以开始用鼠标输入数据");

	PatInStart=1;
	if(pInput==NULL)
	{
		pInput=new double[PatNum*PatDim];
		count=0;
	}
	else
	{
		delete []pInput;
		pInput=new double[PatNum*PatDim];
		count=0;
	}

	RedrawWindow();

	
}



void CISODATAView::OnBegincluster() 
{
	// TODO: Add your command handler code here
	if(ClusCanBegin==0)
	{
		MessageBox("请继续输入数据!");
		return;
	}
	RedrawWindow();
	CDC *pDC;

	pDC=GetDC();
	
	isodata.PatternFromArray(pInput);
	isodata.Process();
	pCluster=isodata.pCluster;
	double x,y;
	int cluscount=1;
	CString str;

	CLUSTER_S *pTempc;
	PATTERN_S *pTempp;
	pTempc=pCluster;
	pTempp=pTempc->pPat;
	if(pTempc==NULL)
		return;
	do
	{
		pTempp=pTempc->pPat;
		do
		{
			if(pTempp==NULL)
				break;
			x=pTempp->pat[0];
			y=pTempp->pat[1];
			str.Format("%d",cluscount);
			pDC->TextOut((int)x,(int)y,str);

			
			pTempp=pTempp->pNext;
		}
		while(pTempp!=NULL);

		cluscount++;

		pTempc=pTempc->pNext;
	}
	while(pTempc!=NULL);
	ReleaseDC(pDC);
	isodata.MemoryFree();

	return ;



	
	
}

⌨️ 快捷键说明

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