📄 ourworkdlg.cpp
字号:
}
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 + -