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

📄 ourworkdlg.cpp

📁 模式识别的一些算法
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}
		while(!m_bFlag)
		{
			CountDistance(&m_strArrayCenterX,&m_strArrayCenterY,m_nGroupCount);
			if(CountNewCenter())
			{///如果返回TURE,表示已经分类完成
				m_bFlag=TRUE;

				break;
			}
			nCount++;
		}
		m_bIsType=TRUE;
		Invalidate(TRUE);////窗口重绘并擦除原来的背景
		DrawOrder();
		DrawPic();
		 strTemp=_T("");
		strTemp.Format(_T("C均值法,迭代次数%d,共分成%d类"),nCount,m_nGroupCount);
		/////显示提示信息//////////////////////
		CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC_INFO);
		SetDlgItemText(IDC_STATIC_INFO,strTemp);
	}
	

	
	
	
	
	//////////////////////////////////////////////
	//MessageBox(strTemp);
	
	//
}

BOOL COurWorkDlg::CheckEnd(float* z_X,float* z_X_tmp,int n)
{
	return TRUE;
}
void COurWorkDlg::CountDistance(CStringArray *pArrayCenterX,CStringArray *pArrayCenterY,int mGroupCount)
{///计算到中心点的距离//
	UpdateData(TRUE);
	int nCount=m_ObjArray.GetSize();
	if(nCount>0&&m_nType==1)
	{
		for(int k=0;k<nCount;k++)
			delete (CTypeAndData*)m_ObjArray.GetAt(k);
		m_ObjArray.RemoveAll();
	}
	nCount=m_ObjArrayISOData.GetSize();
	if(nCount>0&&m_nType==2)
	{
		for(int k=0;k<nCount;k++)
			delete (CTypeAndData*)m_ObjArrayISOData.GetAt(k);
		m_ObjArrayISOData.RemoveAll();
	}
	CStringArray strTempArray;//用来保存和中心点间的距离
	for(int j=0;j<NCOUNT;j++)
	{
		strTempArray.RemoveAll();
		for(int n=0;n<mGroupCount;n++)
		{
			
			CString strTemp=_T("");
			strTemp=pArrayCenterX->GetAt(n);
			float fCenterX=float(atof(strTemp));
			strTemp=pArrayCenterY->GetAt(n);
			float fCenterY=float(atof(strTemp));			
			float fTemp=(float)sqrt(((m_fX[j]-fCenterX)*(m_fX[j]-fCenterX)+(m_fY[j]-fCenterY)*(m_fY[j]-fCenterY)));
			strTemp.Format(_T("%0.3f"),fTemp);
			strTempArray.Add(strTemp);
			
		}
		////判断最小的距离///////////
		int nOrder=0;
		ChooseMinData(&strTempArray,nOrder);
		//////////////////////////////
		////////记录该模式的类别和坐标//////////
		CTypeAndData *pstructTemp=new CTypeAndData();
		pstructTemp->nIndex=nOrder;
		pstructTemp->fX=m_fX[j];
		pstructTemp->fY=m_fY[j];
		if(m_nType==1)
		{
			m_ObjArray.Add(pstructTemp);
		}
		else if(m_nType==2)
		{
			m_ObjArrayISOData.Add(pstructTemp);
		}
		
		
	}


	CString	strTemp="";
	nCount=m_ObjArray.GetSize();
	CString str;
	for(int  n=0;n<nCount;n++)
	{
		CTypeAndData *p=(CTypeAndData*)m_ObjArray.GetAt(n);
		strTemp.Format("%d",p->nIndex);
		str+=strTemp+" ";
	}
	//MessageBox(str);
}

void COurWorkDlg::ChooseMinData(CStringArray *pArrayTemp,int &nOrder)
{
	
	int nCount =pArrayTemp->GetSize();
	CString strTemp=_T("");
	float fPre=(float)atof(pArrayTemp->GetAt(0));
	for(int n=1;n<nCount;n++)
	{
		
		float fNext=(float)atof(pArrayTemp->GetAt(n));
		if(fNext<fPre)
		{
			fPre=fNext;
		}
	}
	strTemp.Format(_T("%0.3f"),fPre);
	for(n=0;n<nCount;n++)
	{
		if(strTemp==pArrayTemp->GetAt(n))
		{
			nOrder=n+1;
			break;
		}
	}
	
	/*strTemp="";
	strTemp.Format("%d",nOrder);
	MessageBox(strTemp);
	strTemp="";
	
	for( n=0;n<nCount;n++)
	{
		strTemp+=pArrayTemp->GetAt(n)+" ";
	}
	MessageBox(strTemp);*/
	
}

BOOL COurWorkDlg::CountNewCenter()
{
	UpdateData(TRUE);
	CStringArray strArrayX;
	CStringArray strArrayY;
	int nCount=m_ObjArray.GetSize();
	int nSumNumer=0;
	int k=1;
	while(k<=m_nGroupCount)
	{
		for(int n=0;n<nCount;n++)
		{
			CTypeAndData *pmyTpyeAndData=(CTypeAndData *)m_ObjArray.GetAt(n);
			if(pmyTpyeAndData->nIndex==k)
			{
				nSumNumer++;
			}
			
		}
		m_nArrayEachNum.Add(nSumNumer);
		nSumNumer=0;
		k++;
	}
	////重新计算中心点////////////

	for(k=0;k<m_nGroupCount;k++)
	{
		float fSumX=0.000f;
		float fSumY=0.000f;
		//int nCountSum=m_nArrayEachNum.GetAt(k);
		int nCountSum=0;
		for(int i=0;i<NCOUNT;i++)
		{
			
			CTypeAndData *pmyTpyeAndData=(CTypeAndData *)m_ObjArray.GetAt(i);
			
			if(pmyTpyeAndData->nIndex==k+1)
			{
				
				fSumX+=(pmyTpyeAndData->fX);
				fSumY+=(pmyTpyeAndData->fY);
				nCountSum++;
				
			}
		}
		CString strTemp=_T("");
		float fTemp=0.000f;
		if(nCountSum==0)
		{
			break;
		}
		fTemp=(fSumX/nCountSum);
		strTemp.Format(_T("%0.3f"),fTemp);
		strArrayX.Add(strTemp);

		strTemp.Format("X中心%0.3f",fTemp);
		//MessageBox(strTemp);

		fTemp=(fSumY/nCountSum);
		strTemp.Format(_T("%0.3f"),fTemp);
		strArrayY.Add(strTemp);

		strTemp.Format(_T("Y中心%0.3f"),fTemp);
        //MessageBox(strTemp);
       
		strTemp.Format("%d每类总数%d",k+1,nCountSum);
		//MessageBox(strTemp);

		

		
	}


	
    //CountDistance(&strArrayX,&strArrayY);
	/////比较现在的中心点和原来的是否相同////////////////////
	for(int i=0;i<m_nGroupCount;i++)
	{
		if(m_strArrayCenterX.GetAt(i)!=strArrayX.GetAt(i)||m_strArrayCenterY.GetAt(i)!=strArrayY.GetAt(i))
		{////如果任意有一个不等,则重新计算,并保留此次的中心

			m_strArrayCenterX.RemoveAll();
			m_strArrayCenterY.RemoveAll();
			for(int j=0;j<m_nGroupCount;j++)
			{
				
				m_strArrayCenterX.Add(strArrayX.GetAt(j));				
				m_strArrayCenterY.Add(strArrayY.GetAt(j));
			}
			return FALSE;
		}
	}
	return TRUE;
///////////////////////////////////////////////////////////
//////////////////////////////////
}

void COurWorkDlg::OnDestroy() 
{

	

	int nCount=m_ObjArray.GetSize();
	for(int n=0;n<nCount;n++)
	{
		delete (CTypeAndData*)m_ObjArray.GetAt(n);
	}
	m_ObjArray.RemoveAll();

	nCount=m_ObjArrayISOData.GetSize();
	for( n=0;n<nCount;n++)
	{
		delete (CTypeAndData*)m_ObjArrayISOData.GetAt(n);
	}
	m_ObjArrayISOData.RemoveAll();

	nCount=m_ObArrayEachInfo.GetSize();
	for( n=0;n<nCount;n++)
	{
		delete (CEachGroupInfo*)m_ObArrayEachInfo.GetAt(n);
	}
	m_ObArrayEachInfo.RemoveAll();
		CDialog::OnDestroy();

	
}


void COurWorkDlg::DrawPic()
{
	UpdateData(TRUE);
	//int nColor[NCOUNT]={RGB(0,0,0),RGB(200,33,100),RGB(255,0,0),RGB(55,34,250),
	//	RGB(15,234,100),RGB(100,200,15),RGB(255,100,255),RGB(255,255,100),RGB(255,0,255),RGB(255,255,0)};
	if(m_nType==1) 
	{//如果是C均值算法
		UpdateData();
		CClientDC dc(this);
		int nY;
		int nX;
		int nCount=0;
		float fTemp=(YUANDIAN_Y-(YEND_Y+30));
		float fEachY=fTemp/10000;
		fTemp=((XEND_X-39)-YUANDIAN_X);
		float fEachX=fTemp/10000;
		nCount=m_nGroupCount;
		nCount=m_ObjArray.GetSize();
		CPen *pOldPen;
		CBrush *pOldBrush;
		for(int k=0;k<nCount;k++)
		{
			CPen pen;
			
			CTypeAndData *pstructTemp=(CTypeAndData*)m_ObjArray.GetAt(k);
			int nIndex=pstructTemp->nIndex;			
			pen.CreatePen(1,1,m_nColor[nIndex]);
			CBrush brush;
			brush.CreateSolidBrush(m_nColor[nIndex]);
			nY=int(pstructTemp->fY*1000);
			nX=int(pstructTemp->fX*1000);
			int nDrawX=int(nX*fEachX+YUANDIAN_X);
			int nDrawY=int(YUANDIAN_Y-nY*fEachY);
			pOldPen=dc.SelectObject(&pen);
			pOldBrush=dc.SelectObject(&brush);
			dc.Ellipse(nDrawX-2,nDrawY-2,nDrawX+2,nDrawY+2);
			dc.SelectObject(pOldPen);
			dc.SelectObject(pOldBrush);
			
		}
	}
	else if(m_nType==2)
	{//如果是ISODATA算法
		UpdateData();
		CClientDC dc(this);
		int nY;
		int nX;
		int nCount=0;
		float fTemp=(YUANDIAN_Y1-(YEND_Y1+30));
		float fEachY=fTemp/10000;
		fTemp=((XEND_X1-39)-YUANDIAN_X1);
		float fEachX=fTemp/10000;
		nCount=m_nGroupCount;
		nCount=m_ObjArrayISOData.GetSize();
		CPen *pOldPen;
		CBrush *pOldBrush;
		for(int k=0;k<nCount;k++)
		{
			CPen pen;
			
			CTypeAndData *pstructTemp=(CTypeAndData*)m_ObjArrayISOData.GetAt(k);
			int nIndex=pstructTemp->nIndex;			
			pen.CreatePen(1,1,m_nColor[nIndex]);
			CBrush brush;
			brush.CreateSolidBrush(m_nColor[nIndex]);
			nY=int(pstructTemp->fY*1000);
			nX=int(pstructTemp->fX*1000);
			int nDrawX=int(nX*fEachX+YUANDIAN_X1);
			int nDrawY=int(YUANDIAN_Y1-nY*fEachY);
			pOldPen=dc.SelectObject(&pen);
			pOldBrush=dc.SelectObject(&brush);
			dc.Ellipse(nDrawX-2,nDrawY-2,nDrawX+2,nDrawY+2);
			dc.SelectObject(pOldPen);
			dc.SelectObject(pOldBrush);
			
		}
	}

	if(m_bIsC)
	{
		UpdateData();
		CClientDC dc(this);
		int nY;
		int nX;
		int nCount=0;
		float fTemp=(YUANDIAN_Y-(YEND_Y+30));
		float fEachY=fTemp/10000;
		fTemp=((XEND_X-39)-YUANDIAN_X);
		float fEachX=fTemp/10000;
		nCount=m_nGroupCount;
		nCount=m_ObjArray.GetSize();
		CPen *pOldPen;
		CBrush *pOldBrush;
		for(int k=0;k<nCount;k++)
		{
			CPen pen;
			
			CTypeAndData *pstructTemp=(CTypeAndData*)m_ObjArray.GetAt(k);
			int nIndex=pstructTemp->nIndex;			
			pen.CreatePen(1,1,m_nColor[nIndex]);
			CBrush brush;
			brush.CreateSolidBrush(m_nColor[nIndex]);
			nY=int(pstructTemp->fY*1000);
			nX=int(pstructTemp->fX*1000);
			int nDrawX=int(nX*fEachX+YUANDIAN_X);
			int nDrawY=int(YUANDIAN_Y-nY*fEachY);
			pOldPen=dc.SelectObject(&pen);
			pOldBrush=dc.SelectObject(&brush);
			dc.Ellipse(nDrawX-2,nDrawY-2,nDrawX+2,nDrawY+2);
			dc.SelectObject(pOldPen);
			dc.SelectObject(pOldBrush);
			
		}
	}
	if(m_bIsIsoData)
	{
		UpdateData();
		CClientDC dc(this);
		int nY;
		int nX;
		int nCount=0;
		float fTemp=(YUANDIAN_Y1-(YEND_Y1+30));
		float fEachY=fTemp/10000;
		fTemp=((XEND_X1-39)-YUANDIAN_X1);
		float fEachX=fTemp/10000;
		nCount=m_nGroupCount;
		nCount=m_ObjArrayISOData.GetSize();
		CPen *pOldPen;
		CBrush *pOldBrush;
		for(int k=0;k<nCount;k++)
		{
			CPen pen;
			
			CTypeAndData *pstructTemp=(CTypeAndData*)m_ObjArrayISOData.GetAt(k);
			int nIndex=pstructTemp->nIndex;			
			pen.CreatePen(1,1,m_nColor[nIndex]);
			CBrush brush;
			brush.CreateSolidBrush(m_nColor[nIndex]);
			nY=int(pstructTemp->fY*1000);
			nX=int(pstructTemp->fX*1000);
			int nDrawX=int(nX*fEachX+YUANDIAN_X1);
			int nDrawY=int(YUANDIAN_Y1-nY*fEachY);
			pOldPen=dc.SelectObject(&pen);
			pOldBrush=dc.SelectObject(&brush);
			dc.Ellipse(nDrawX-2,nDrawY-2,nDrawX+2,nDrawY+2);
			dc.SelectObject(pOldPen);
			dc.SelectObject(pOldBrush);
			
		}
	}

	

	
}

BOOL COurWorkDlg::OnEraseBkgnd(CDC* pDC) 
{
	Invalidate(NULL);
	DrawOrder();
	DrawISODataOrder();
	//ShowISODataDot();
	if(m_bIsType)
	{
		DrawPic();
	}
		// TODO: Add your message handler code here and/or call default
	
	return CDialog::OnEraseBkgnd(pDC);
}

void COurWorkDlg::MakeRndColor(int nCount[])
{
	srand(GetTickCount());
	for(int n=0;n<NCOUNT;n++)
	{
		int n1=rand()%255;
		int n2=rand()%255;
		int n3=rand()%255;
		nCount[n]=RGB(n1,n2,n3);
	}
}

BOOL COurWorkDlg::JudgeColorRepeate(int nCount[])
{

	for(int i=0;i<NCOUNT-1;i++)
	{
		for(int j=i+1;j<NCOUNT;j++)
		{
			if(nCount[i]==nCount[j])
				return TRUE;
		}
	}
	return FALSE;
}

HBRUSH COurWorkDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	if(pWnd->GetDlgCtrlID()==IDC_STATIC_INFO)
	{
		::SetTextColor( *pDC , RGB(255,0,0) );
		::SetBkMode( *pDC , TRANSPARENT ) ;

⌨️ 快捷键说明

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